Ruby ArgumentError: unknown keyword, but not sure why
Ruby ArgumentError: unknown keyword, but not sure why
我正在尝试在 Rails 插件上制作一个简单的 Ruby。当使用 render_opts 的散列调用 redcarpetable 函数时,我得到 "ArgumentError: unknown keyword: 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}
为了允许渲染选项的散列,必须对函数声明做些什么?完整代码(还没有很好地记录或重构)是 here.
我认为您的问题可能是由于将 *fields
splat 放在其他参数之前引起的。
虽然我不确定是什么导致了您的错误,但您可以使用以下方法获取选项散列:
def redcarpetable(options={}, *fields)
defaults = {
foo: "bar",
bar: "foo"
}
options= defaults.merge(options)
puts options[:foo] # => "bar"
end
这样您就可以设置默认值并在调用该方法时覆盖它们。
在您的方法主体中,您将不得不通过选项哈希引用变量,
即 options[:foo]
而不仅仅是 foo
.
当您调用该方法时,除非您不向 *fields
传递任何内容,否则您将
必须在您的选项参数中包含大括号。
例如:
redcarpetable({foo: bar}, ["field1" "field2"]
而不是:
redcarpetable(foo: bar, ["field1, "field2"]
此外,如果您要传递任何字段但不传递任何选项,则必须包括
空括号:
redcarpetable({}, ["field1", "field2"])
你这样调用 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
您可能还想在方法的签名中更改它。
我正在尝试在 Rails 插件上制作一个简单的 Ruby。当使用 render_opts 的散列调用 redcarpetable 函数时,我得到 "ArgumentError: unknown keyword: 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}
为了允许渲染选项的散列,必须对函数声明做些什么?完整代码(还没有很好地记录或重构)是 here.
我认为您的问题可能是由于将 *fields
splat 放在其他参数之前引起的。
虽然我不确定是什么导致了您的错误,但您可以使用以下方法获取选项散列:
def redcarpetable(options={}, *fields)
defaults = {
foo: "bar",
bar: "foo"
}
options= defaults.merge(options)
puts options[:foo] # => "bar"
end
这样您就可以设置默认值并在调用该方法时覆盖它们。
在您的方法主体中,您将不得不通过选项哈希引用变量,
即 options[:foo]
而不仅仅是 foo
.
当您调用该方法时,除非您不向 *fields
传递任何内容,否则您将
必须在您的选项参数中包含大括号。
例如:
redcarpetable({foo: bar}, ["field1" "field2"]
而不是:
redcarpetable(foo: bar, ["field1, "field2"]
此外,如果您要传递任何字段但不传递任何选项,则必须包括 空括号:
redcarpetable({}, ["field1", "field2"])
你这样调用 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
您可能还想在方法的签名中更改它。