【问题标题】:Ruby: How do I pass all parameters and blocks received by one method to another?Ruby:如何将一种方法接收到的所有参数和块传递给另一种方法?
【发布时间】:2011-06-08 16:53:32
【问题描述】:

我正在编写一个帮助程序,将 HTML 属性添加到 rails 中的 link_to 标记。所以,我的想法是我的辅助方法应该接受传递给它的任何参数或块,使用相同的参数调用 link_to,将它的属性添加到返回的内容中,并将结果返回给调用者。

像这样:

def link_to(*args, &block)
  ... rails code in link_to ...
end

def myhelper(*args, &block) # Notice that at this point, 'args' has already
  link_to()                 # become an array of arguments and 'block' has
  ... my code ...           # already been turned into a Proc.
end

myhelper() # Any arguments or blocks I pass with this call should make
           # it all the way through to link_to.

因此,如您所见,似乎没有办法(不涉及大量代码和条件分支)将 myhelper 收到的内容传递给 link_to 而不将所有参数恢复为之前的样子他们采用了我的方法。

对于这个问题是否有更“类似于 Ruby”的解决方案?

【问题讨论】:

  • 请注意,在 Ruby 2.0 中,命名参数也可能必须被转发...

标签: ruby-on-rails ruby


【解决方案1】:

您可以在方法调用中使用*& 将数组转回参数列表并将procs 转回块。所以你可以这样做:

def myhelper(*args, &block)
  link_to(*args, &block)
  # your code
end

【讨论】:

  • 我现在觉得自己很愚蠢 :-) 我确定你错了,我正在编写一些示例代码来证明这一点,当然你是对的。谢谢!
  • @Ajedi32 是的,它们被收集到一个哈希中,例如foo(:bar, baz: 'qux') 变为 [:bar, {:baz=>"qux"}]
【解决方案2】:

定义方法(...)

Ruby 2.7 开始,可以使用 (...) 将当前方法的所有参数传递给另一个方法。

那么,现在,

def my_helper(*args, &block)
  link_to(*args, &block)
  
  # your code
end

可以改写为

def my_helper(...)
  link_to(...)

  # your code
end

这里是the link to the feature request

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 2020-12-07
    • 2017-07-29
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多