Ruby on Rails content_tag options hash - 设置boolean html属性?

时间:2011-03-10 00:37:21

标签: ruby-on-rails view html-helper view-helpers

布尔属性,在html 5草案规范中定义:

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

  

是否存在布尔属性   元素代表真实价值,   并且没有属性   代表虚假的价值。

     

如果属性存在,则为其值   必须是空字符串或a   值是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 =&gt; 'itemscope',但很难说谷歌是否会正确解释这一点,因为他们的所有示例和规范都显示了最小化的版本。请参阅此处:http://www.google.com/support/webmasters/bin/answer.py?answer=146861以查看这些属性是什么以及我使用它们的原因(微数据格式)

任何人都知道如何在content_tag中有效地获取任何属性发送的真或假(ruby布尔值),以便在没有任何值的情况下呈现而不是尝试对布尔值进行字符串化?谢谢:))

2 个答案:

答案 0 :(得分:3)

hacky但简单的方法:content_tag('div itemscope', ...)

答案 1 :(得分:2)

将以下内容放入名为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)

Et Voila!重新启动Rails你应该很高兴。我不知道如何使这个东西只添加一个空白属性,只是如何使其工作像检查,禁用,只读等...