【问题标题】:rails and html data attributes: use dash(-) or underscore(_)?rails 和 html 数据属性:使用破折号(-)还是下划线(_)?
【发布时间】:2013-03-05 16:27:18
【问题描述】:

最近,我在 Rails 应用程序中遇到了 HTML 自定义数据属性的问题。我使用以下模式向 html 标记添加一些数据属性,并稍后在我的 javascript(jQuery) 代码中使用它们:

= %a.name{ href: "url.com", data: {first_name: "ben", last_name: "amsalem} }

在 javascript 代码中,我访问了这些属性:

alert($(".name").data("first_name") + " " + $(".name").data("last_name"));

在我的开发环境中,它运行良好,我得到了预期的结果(过去我的生产环境也是如此),但在我当前的生产版本中,我得到“未定义”的值。 我检查了页面的 HTML 源代码,发现现在有类似的内容:

<a class="name" href="url.com" data-first-name="ben" data-last-name="amsalem" />

代替:

<a class="name" href="url.com" data-first_name="ben" data-last_name="amsalem" />

为什么会这样?是什么导致了这种变化?

【问题讨论】:

  • 看起来它现在更正确,要访问它,您需要.data("lastName") 您更新rails了吗?这或许可以解释这种变化。
  • 属性名最好不要使用下划线。我确信在 MVC 中 Html Helpers 会将下划线转换为破折号。更容易使用 data-firstname 例如
  • 他在这里使用下划线是对的,因为你不能在符号中使用破折号,而且这种语法真的很丑:"first-name"
  • 您将如何在模型/控制器中访问此数据属性?

标签: jquery ruby-on-rails html custom-data-attribute


【解决方案1】:

这很正常,data: { first_name: "ben" } 应该产生data-first-name="ben"

访问此属性的最佳方法是使用.data("firstName"),但.data("first-name") 也可以。

【讨论】:

  • 我同意,这是正确和正常的。但在以前的版本中它是 data-first_name,所以我的 JavaScript 代码是 data("first_name")。是什么造成了这种变化?
  • 据我所知,rails 在使用这种语法{ data: { first_name: "" } } 时从未生成过data-first_name,但我可能错了。也许您使用的是字符串版本,例如data: { "first_name" =&gt; "ben" }。如果没有,那我就不知道了。
  • 不,我再次检查并使用符号版本而不是字符串版本。这有点奇怪,因为我 100% 确定它曾经在我的旧版本中工作并且仍然在开发环境中工作。
  • 您确定它正在生成data-last_name?还是您只知道.data("first_name") 在您的 JS 中工作?因为有可能旧的 jquery 版本能够将“first_name”解释为“first-name”。但无论如何,你应该修复你的代码并继续;)
  • 100% 确定,它正在生成data-last_name。我会更新的,谢谢。
【解决方案2】:

我认为您正在使用 HAML。自 4.0 以来,Hypernation 是默认设置。将 hyphenate_data_attrs 设置为 false 以关闭此功能。

文档:http://haml.info/docs/yardoc/Haml/Options.html#hyphenate_data_attrs-instance_method

原创 github pull 讨论:https://github.com/haml/haml/pull/488

【讨论】:

  • 但是首先不应该有下划线,因为rails会生成data-first-name,对吧?
  • @Robin 下划线不会自动替换为 v.4.0 之前的连字符:github.com/haml/haml/issues/478
  • 糟糕,我已经习惯了 rails 语法,以至于我没有注意到他实际上并没有使用 rails 助手,而是 haml。所以是的,你是对的,我认为这应该是公认的答案。
【解决方案3】:

经过我所做的测试:似乎在开发中我在 3.2.9 版本中有 gem,而在生产中它是 3.2.12 - 在这些版本之间修复了错误行为(转换为 &lt;a date-last_name/&gt;),并且在升级我的开发版本我可以看到变化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 2012-12-21
    • 2011-07-13
    相关资源
    最近更新 更多