Ruby on Rails content_tag选项哈希 - 如何设置布尔类型的HTML属性?

8

布尔属性,如HTML 5草案规定:

http://dev.w3.org/html5/spec/Overview.html#boolean-attributes

一个元素上存在布尔属性代表着真值,而不存在该属性则代表假值。

如果该属性存在,其值只能是空字符串或与属性规范名称不区分大小写的ASCII字符匹配值(首尾不能有空格)。

我的页面使用html5 DTD。我试图在自己的帮助器中使用content_tag视图助手,但在将布尔属性传递给它时出现了问题。

具体来说,这是我的帮助器:

def itemscope(type, options = {}, &block)
  content_tag(
    :div, {
      :itemscope => true,
      :itemtype => data_definition_url(type)
    }.merge(options),
    true,
    &block
  )
end

def data_definition_url(type)
  "http://data-vocabulary.org/#{type}"
end

在我看来,假设我这样称呼它(我使用的是Haml):
= itemscope("Organization") do
  %h1 Here's some content

这是我希望它呈现的内容:

<div itemscope itemtype='http://data-vocabulary.org/Organization'>
  <h1>Here's some content</h1>
</div>

但这是我实际得到的内容:
<div itemscope='true' itemtype='http://data-vocabulary.org/Organization'>
  <h1>Here's some content</h1>
</div>

根据w3规范,以下是无效标记。布尔属性的合法值只能是属性本身的名称或没有值。
这很烦人,因为我可以将“:itemscope => true”更改为“:checked => true”,然后它将在div元素的属性列表中正确呈现为“checked ='checked'”。
我希望它呈现出仅使用“itemscope”的最小化版本……但我不确定如何使用content_tag选项来实现。我可以很容易地发送“:itemscope =>'itemscope'”,但很难说谷歌是否会正确解释它,因为他们所有的示例和规范都显示了最小化版本。请参见此处http://www.google.com/support/webmasters/bin/answer.py?answer=146861以查看这些属性是什么以及我为什么要使用它们(微数据格式)。
有人知道如何有效地使任何属性以true或false(ruby布尔)值发送到content_tag以呈现没有任何值而不是尝试将布尔值字符串化吗?谢谢 :)

听起来是一个很好的补丁想法 :) 尽管这个补丁是针对 HAML 而不是 Rails。 - Alex Wayne
2
不,问题出在Rails的content_tag助手函数和相关功能上,而不是HAML。 - jakeonrails
2个回答

3
将以下内容放入名为config/initializers/boolean_attributes.rb的初始化器中。
# add any other boolean attributes to the %w() below to make them work like checked.
BOOLEAN_ATTRIBUTES = %w(itemscope).to_set
BOOLEAN_ATTRIBUTES.merge(BOOLEAN_ATTRIBUTES.map {|attribute| attribute.to_sym })
ActionView::Helpers::TagHelper::BOOLEAN_ATTRIBUTES.merge(BOOLEAN_ATTRIBUTES)

好的,重新启动Rails之后,您就可以愉快地使用它了。我不知道如何使该工具添加一个空属性,只知道如何让其像checked、disabled、readonly等属性一样正常工作。


2
我会尝试一下 - 但如果它聪明到能够看到值“true”并且知道你想要什么,那就太好了 =p - nzifnab
事实上,当“Rails Magic”不能达到我们的期望时,我们会感到失望。但我认为它有其原因,因为在JavaScript中设置自定义属性(比如“data-is_active”)为true时,我们期望在该属性上看到一个true或false值,而不是“data-is_active” == “data-is_active”。 - jakeonrails
1
我同意@nzifnab的观点,如果您提供布尔Ruby值(true或false),它应该足够智能以将其视为符合布尔HTML属性。 如果您想要字面字符串“true”或“false”,请提供Ruby值“true”或“false”! - Tyler Rick

3
简单易懂的方法是:使用以下代码:content_tag('div itemscope', ...)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接