【问题标题】:ruby call method with double splash parameter带有双飞溅参数的 ruby​​ 调用方法
【发布时间】:2022-08-10 16:39:05
【问题描述】:

我有一个旧的辅助方法定义为:

def feature(label, style = \'text\', inverse: false, **html_options)

由另一个助手调用,调用它:

def create_feature(level, html_options = {})
  label, value = .....
  feature(label, value, html_options)
end

在我的例子中:

(byebug) label
\"In progress\"
(byebug) value
:pending
(byebug) html_options
{ \"data-value\"=>\"pending\", :class=>\"mr-2\"}

我在我正在编辑的视图中调用它(在这种情况下我很乐意修改的唯一一点代码):

<%= create_feature(level, my_helper(:pending).merge({class: \'mr-2\'})) %>

其中my_helper 为html 元素生成data-value: pending 属性。

此代码的先前版本是:

<%= create_feature(level, class: \'mr-2\') %>

这有效,我现在需要添加带有来自my_helper 的额外属性的哈希,但我得到的是:

*** ArgumentError Exception: wrong number of arguments (given 3, expected 1..2)

奇怪的是,我创建了相同代码的虚拟版本,它工作得很好:


  def feature(label, style = \'text\', inverse: false, **html_options)
    pp html_options
  end

 def create_feature(level, html_options = {})
    label, value = [\'in progress\', :pending]
    feature(label, value, html_options)
  end

create_feature(12, {hello: \'hello\', class: \'mr-2\'})
# {:hello=>\"hello\", :class=>\"mr-2\"}
  • \"我创建了相同代码的虚拟版本,它工作得很好\"– 如果是这样,错误的原因在您显示的代码之外。仔细查看错误消息及其堆栈跟踪。也许还有另一种方法叫你失踪。

标签: ruby-on-rails ruby


【解决方案1】:

由于助手将html_options 定义为“通吃”keyword argument,因此您必须这样传递它:

def create_feature(level, html_options = {})
  label, value = .....
  feature(label, value, **html_options)
  #                     ^^
  #                  add this
end

** 运算符将转换您的 hash to keyword arguments

【讨论】:

  • 谢谢,我试过了,我得到了同样的错误。
  • @DonGiulio 错误消息说“给定 3”(参数)但 feature(label, value, **html_options) 只传递 2 个位置参数。如果您收到相同的错误消息,则它来自另一个方法调用。
  • 我想通了,谢谢,由于某些原因,哈希的键必须是所有符号,这就是虚拟示例起作用的原因。我将助手主调用更改为:&lt;%= create_feature(level, my_helper(:pending).merge({class: 'mr-2'}).symbolize_keys) %&gt;,它现在可以工作了
【解决方案2】:

找出问题,它没有记录,但在 splash 参数中传递的哈希需要将所有符号作为键。弦乐不行。

所以我要做的就是调用该方法并在参数中使用.symbolize_keys

我觉得这有点烦人,因为在每次调用带有启动参数的方法时,您都不得不记住这个实现细节。但事实就是这样。

【讨论】:

    猜你喜欢
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 2021-03-23
    • 1970-01-01
    相关资源
    最近更新 更多