您对 Ruby 的语法糖(Rails 大量使用)感到困惑。在回答你的问题之前,让我简要解释一下。
当 ruby 函数采用一个散列参数时:
def foo(options)
#options is a hash with parameters inside
end
您可以“忘记”放置括号/方括号,并像这样称呼它:
foo :param => value, :param2 => value
Ruby 将填补空白并理解您要完成的是:
foo({:param => value, :param2 => value})
现在,对于您的问题:link_to
采用两个可选的哈希值 - 一个被调用options
,另一个被调用html_options
。你可以想象它是这样定义的(这是一个近似值,它要复杂得多)
def link_to(name, options, html_options)
...
end
现在,如果您以这种方式调用它:
link_to 'Comments', :name => 'Comments'
Ruby 会有些困惑。它会尝试为您“填空”,但不正确:
link_to('Comments', {:name => 'Comments'}, {}) # incorrect
它会认为那name => 'Comments'
部分属于选项,而不是html_options
!
你必须自己填补空白来帮助 ruby。将所有括号放在适当的位置,它将按预期运行:
link_to('Comments', {}, {:name => 'Comments'}) # correct
如果需要,您实际上可以删除最后一组括号:
link_to("Comments", {}, :name => "comments") # also correct
但是,为了使用 html_options,您必须保留第一组括号。例如,您需要对带有确认消息和名称的链接执行此操作:
link_to("Comments", {:confirm => 'Sure?'}, :name => "comments")
其他rails helper 具有类似的结构(即form_for
,collection_select
),因此您应该学习这种技术。如有疑问,只需添加所有括号。