理解link_to语法和哈希参数

时间:2014-06-28 23:39:02

标签: ruby-on-rails

敏捷第6章中这一行的语法让我和文档一样困惑。当哈希用作参数时,我很难理解发生了什么。

这一行是这样的:

link_to 'Destroy', product, method: :delete, data: { confirm: 'Are you sure?' }

shortened man page就是这样:

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

使用set创建的URL创建给定名称的链接标记   选项。请参阅url_for文档中的有效选项。

     

选项

     

•:data - 此选项可用于添加自定义数据属性。

     

•method:HTTP动词的符号 - 此修饰符将动态创建HTML表单并立即提交表单以进行处理   使用指定的HTTP谓词。

     

数据属性

     

•确认:'问题?' - 这将允许不显眼的JavaScript驱动程序提示指定的问题(在这种情况下,生成的文本会有问题吗?

在这种情况下,它看起来像我传递了1个参数(name ='Destroy')和一个选项哈希。没有HTML选项哈希或代码块。没有指定url_for选项。

我无法理解该手册页。 “选项”部分描述了选项哈希的一些(但不是全部)允许值。 options散列中的一个参数是:data和“Data Attributes”部分描述该散列的选项。虽然看起来它们描述的是相同的东西,但Data属性实际上嵌套在Options hash中。

如果我得到了正确的话,那么看起来选项哈希包含第二个哈希,称为:data,这是我传递confirm:value的地方。

我可以用更多的parens重新编写一行来制作如此明确的哈希:

link_to ('Destroy', { product, method: :delete, data: { confirm: 'Are you sure?' } })

假设我完全正确,我不理解选项哈希的第一个元素,产品

散列元素是否需要散列键?它看起来像一个模型类只是扔在那里...我认为这是一个参数,但似乎错了。

我正确地理解了这一点吗?

2 个答案:

答案 0 :(得分:2)

不,{ product, method: :delete语法无效。您不能在哈希中只有一个值的元素(即product)。哈希具有键/值对。

您猜对了,因为您依赖于方法签名,但Ruby中没有对参数进行类型检查,因此该函数可以重写"但是它想要它的论点。

该文档告诉您link_to许多签名:

link_to(body, url, html_options = {})
  # url is a String; you can use URL helpers like
  # posts_path

link_to(body, url_options = {}, html_options = {})
  # url_options, except :method, is passed to url_for

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

link_to(url, html_options = {}) do
  # name
end

在您的情况下,您使用第二个版本(body, url_options, html_options)

该行分解如下:

  • 'Destroy', - body:按钮上显示的标签

  • product, - url_options:与之关联的模型。它将传递给url_forproduct_path(product)将检查模型的类名,以确定要调用的URL帮助方法的名称;根据您的变量名称,它可能是method: :delete, data: { confirm: 'Are you sure?' }

  • html_options - link_to( 'Destroy', product, { method: :delete, data: { confirm: 'Are you sure?' } } ) :选项哈希

如果你想用更多标点符号和空格来编写它,它将如下所示:

{{1}}

答案 1 :(得分:0)

第二个参数"选项"不一定是哈希。它可以是一个字符串。

  

也可以传递一个String而不是一个options hash,它生成一个链接标记,该标记使用String的值作为链接的href。

在您的情况下,我认为"产品"应该像" product_path"。

link_to 'Destroy', product_path, method: :delete, data: { confirm: 'Are you sure?' }

'销毁'是你的第一个参数,product_path是你的第二个参数,其余的是第三个参数。