当前位置: 首页 > 知识库问答 >
问题:

了解link_to语法和散列参数

宰父淳
2023-03-14

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

这条线是这样的:

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

缩短的手册页如下:

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

创建给定的链接标签

选项

•:数据

•方法:HTTP动词的符号

数据属性

确认:“问题?”

在本例中,看起来我传递了一个参数(name=‘Destroy’)和一个选项哈希。没有HTML选项哈希或代码块。未指定任何url_for选项。

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

如果我没弄错的话,那么看起来Options hash包含了第二个hash,称为:data,我在这里传递confirm:值。

我可以用更多的paren重新编写这行,使显式散列如下:

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

假设我做对了,我不明白选项哈希的第一个元素,产品。

哈希元素不需要哈希键吗?看起来就像一个模型类被扔进去了……我以为这是一个参数,但这似乎是错误的。

我的理解正确吗?

共有2个答案

艾浩广
2023-03-14

第二个参数“options”不必是散列值。它可以是字符串。

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

对于您的情况,我认为“产品”应该是类似于“产品_路径”的东西。

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

“Destroy”是第一个参数,product_path是第二个参数,其余参数是第三个参数。

阳长恨
2023-03-14

不,< code>{ product,method: :delete是无效语法。散列中不能有只有一个值的元素(即< code>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

在本例中,您使用的是第二个版本,其中包含(正文、url_options、html_option)

该行是这样分解的:

>

  • 'Destroy',-主体:将显示在按钮上的标签

    < code >产品 - url_options:链接到的型号。它将被传递给< code>url_for,后者将检查模型的类名,以确定要调用的URL helper方法的名称;根据您的变量名,它可能是< code > product _ path(product)

    方法::删除,数据:{确认:“你确定吗?”}-html_options:选项哈希

    如果你想用更多的标点符号和空格来写它,它看起来像这样:

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

  •  类似资料:
    • 嵌套哈希参数有一些问题。这个产品有许多特点。假设产品1具有功能foo和baz。 我想通过产品和所有功能来查询link_to中的字符串参数,这样它最终看起来像这样: "/小狗/新?特征[baz]=qux 我目前正在尝试这个,它会出现语法错误,原因可能对不是我的人来说很明显。 知道我在干什么蠢事吗? 更新:我已将代码更新为: <代码> 这更接近,因为我的输出URL现在是: /puppies/new?特

    • 将输入的字符串散列成一个整数。 使用 String.split('') 和 Array.reduce() 创建输入字符串的散列,利用位移。 const sdbm = str => { let arr = str.split(''); return arr.reduce( (hashCode, currentVal) => (hashCode = currentVal.c

    • 问题内容: 我无法解决问题 我看不到为什么被指定?是名称,但我不确定。 的片段 二手教程在这里。 问题答案: 该方法的文档如下: 从意图中检索扩展数据。 参量 所需项目的名称。 如果没有使用给定名称存储所需类型的值,则返回该值。 退货 以前使用putExtra()添加的项目的值;如果未找到,则为默认值。 因此,在您的示例中,如果该键存在于中,则将被分配与该键关联的整数值;如果不存在,则将被分配该整

    • 问题内容: 我正在开发一个小型的Web应用程序,该应用程序在内部对用户进行身份验证。一旦用户通过身份验证,我的Web应用程序便会将一些信息(例如userID和Person的名称)传递给第三方Web应用程序。第三方开发人员建议我们对值进行哈希处理和加盐处理。 原谅我的无知,但这到底意味着什么? 我正在用Java编写应用程序。因此,我打算做的是使用Apache Commons Digest Utils

    • 根据关键码值(Key value)直接进行访问的数据结构;它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度;这个映射函数叫做散列函数,存放记录的数组叫做散列表。

    • 考虑 HashSet 作为一个 HashMap,在此处我们只关心键(HashSet<T> 实际上只是一个包围 HashMap<T, ()> 的装包(wrapper))。(原文:Consider a HashSet as a HashMap where we just care about the keys (HashSet<T> is, in actuality, just a wrapper a