如何将link_to语法转换为使用块?

时间:2016-12-12 22:27:38

标签: ruby-on-rails ruby

我有一个视图,当前使用link_to对象,使用documentation中定义的签名:

link_to(body, url_options = {}, html_options = {}) 

我想将其转换为块样式语法,以便我可以在link_to中添加几个样式元素。我一直在尝试使用文档中提供的备用签名:

link_to(options = {}, html_options={}) do
   #stuff
end

但这不成功,因为它不提供url_options哈希,只提供options。有没有办法让options哈希接受我当前的url_options?例如,我当前(工作)的代码如下:

link_to ’Click Me’, { controller: :projects, action: :create, project: { modification: true } }, method: :post

我试图让它以下面的形式(在HAML中)工作:

link_to { controller: :projects, action: :create, project: { modification: true } }, method: :post do
   .heading 'Click me'
    #add some other elements here

这给了我以下错误:

syntax error, unexpected ':', expecting '}' 

或者,我是否忽略了在link_to中实现块的另一种方法?我是Rails和编程的新手,所以任何帮助都会受到赞赏,包括如何以更有用的方式提出这个问题的建议。

4 个答案:

答案 0 :(得分:0)

实际上link_to签名确实提供了url_options arg,即使是一个块。以下是rails源中的签名:

link_to(name = nil, options = nil, html_options = nil, &block)

实际上,选项和网址选项是一回事。以下是link_to方法中发生的事情:

url = url_for(options)

因此,如果您传递的选项适用于url_for,您仍然可以传递它们以及块。

这里的关键是带有块的方法和没有块的方法不是两种不同的重载方法,如果你选择不提供arg,它与默认args的方法相同。

答案 1 :(得分:0)

Rails似乎对这些参数感到困惑。我怀疑嵌套的{}正在抛弃它。

一种解决方案是添加() s,以明确哪个参数是哪个。

link_to ({ controller: :projects, action: :create, project: { modification: true } }, method: :post) do
   .heading 'Click me'

答案 2 :(得分:0)

为什么不使用更简单的路径/网址助手:

projects_path(project: { modification: true })

答案 3 :(得分:0)

请记住,花括号在Ruby中有多个用途。一种是将哈希包含在内,例如:

{a: 1, b: 2}

另一种方法是将块传递给方法,例如:

[1, 2].map { |i| i * 2 }

如果是以下代码:

= link_to { controller: :projects, action: :create, project: { modification: true } }, method: :post do
  .heading 'Click me'

当您尝试将块传递给link_to时,Ruby会解释第一个打开的大括号,而实际上您想要创建Hash

通过为link_to添加括号来解决这个问题,以便Ruby已经将第一个花括号视为参数的一部分:

= link_to({controller: :projects, action: :create, project: {modification: true}}, method: :post) do
  .heading 'Click me'