敏捷第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?' } })
假设我完全正确,我不理解选项哈希的第一个元素,产品。
散列元素是否需要散列键?它看起来像一个模型类只是扔在那里...我认为这是一个参数,但似乎错了。
我正确地理解了这一点吗?答案 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_for
,product_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是你的第二个参数,其余的是第三个参数。