ruby-on-railsrubyruby-on-rails-plugins

Ruby ArgumentError: unknown keyword, but not sure why


I'm trying to make a simple Ruby on Rails plugin. When the redcarpetable function is called with a hash for render_opts, I get "ArgumentError: unknown keyword: render_opts." The code for the function:

def redcarpetable(*fields, renderer: :default, as: [nil], prefix: "rendered", render_opts: {})
    fields.each do |field|
      if fields.count > 1
        define_method "#{prefix}_#{field}" do
        Carpet::Rendering.render(read_attribute(field), renderer_opts: render_opts, rc_renderer: renderer).html_safe
        end # End defining the method dynamically.
      else
        if as[0]
          as.each do |method_name|
            define_method "#{method_name}" do
            Carpet::Rendering.render(read_attribute(field), render_opts: render_opts, rc_renderer: renderer).html_safe
            end # End defining the method dynamically.
          end
        else
          define_method "rendered_#{field}" do
          Carpet::Rendering.render(read_attribute(field), render_opts: render_opts, rc_renderer: renderer).html_safe
          end # End defining the method dynamically.
        end
      end
    end # End the fields loop.
  end # End the redcarpet method.

How the function is called:

redcarpetable :name, renderer: :simple_parser, as: [:cool_name, :rendered_name], render_opts: {:generate_toc_data: true}

In order to allow for a hash of render options, what must be done to the function declaration? The full code (not documented well or refactored yet) is here.


Solution

  • You call the Carpet::Rendering like this:

    Carpet::Rendering.render(read_attribute(field), 
      render_opts: render_opts, rc_renderer: renderer
    ).html_safe
    

    But the option is actually called renderer_opts. Just change it to:

    Carpet::Rendering.render(read_attribute(field), 
      renderer_opts: render_opts, rc_renderer: renderer
    ).html_safe
    

    You might also want to change it in the methods' signature too.