Techioz Blog

Ruby ArgumentError: 不明なキーワードですが、理由はわかりません

概要

シンプルな Ruby on Rails プラグインを作成しようとしています。 redcarpetable 関数が render_opts のハッシュを使用して呼び出されると、「ArgumentError: 不明なキーワード: render_opts」が発生します。関数のコード:

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.

関数の呼び出し方法:

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

レンダリング オプションのハッシュを許可するには、関数宣言に何を行う必要がありますか?完全なコード (十分に文書化されていない、またはまだリファクタリングされていません) はここにあります。

解決策

Carpet::Rendering を次のように呼び出します。

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

ただし、このオプションは実際には renderer_opts と呼ばれます。次のように変更するだけです。

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

メソッドのシグネチャでも変更したい場合があります。