【问题标题】:understanding link_to syntax and hash params理解 link_to 语法和哈希参数
【发布时间】:2014-07-22 10:04:52
【问题描述】:

Agile 第 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)

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

选项

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

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

数据属性

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

在这种情况下,我似乎传递了 1 个参数(名称 = 'Destroy')和一个用于选项的哈希。没有 HTML 选项哈希或代码块。没有指定任何 url_for 选项。

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

如果我猜对了,那么 Options 散列似乎包含第二个散列,称为 :data,这是我传递确认:值的地方。

我可以用更多的括号重新编写该行,以生成像这样的显式哈希:

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

假设我没看错,我不理解选项哈希的第一个元素 product。

哈希元素不需要哈希键吗?看起来像一个模型类只是被扔在那里......我以为它是一个参数,但似乎错了。

我理解正确吗?

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    不,{ 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,它将检查模型的类名以确定要调用的 URL 帮助器方法的名称;根据您的变量名称,它可能是product_path(product)

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

    如果你想用更多的标点符号和空格来写它,它应该是这样的:

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

    【讨论】:

    • 谢谢。这个解释很有帮助。我发现这些签名非常混乱,显然没有猜到第二个选项是正确的签名。
    【解决方案2】:

    第二个参数“options”不一定是Hash。可以是字符串。

    也可以传递一个字符串而不是一个选项哈希,它会生成一个链接标记,该标记使用字符串的值作为链接的 href。

    在您的情况下,我认为“产品”应该类似于“产品路径”。

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

    'Destroy' 是你的第一个参数,product_path 是你的第二个参数,其余的如果是第三个参数。

    【讨论】:

      猜你喜欢
      • 2013-07-27
      • 1970-01-01
      • 1970-01-01
      • 2014-12-09
      • 2012-10-18
      • 1970-01-01
      • 2016-01-07
      • 1970-01-01
      • 2016-08-20
      相关资源
      最近更新 更多