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

nzi*_*nab 6 html-helper ruby-on-rails view view-helpers

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

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

元素上存在布尔属性表示真值,缺少属性表示false值.

如果该属性存在,则其值必须是空字符串,或者是属性的规范名称的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
Run Code Online (Sandbox Code Playgroud)

在我看来,假设我称之为(我正在使用haml):

= itemscope("Organization") do
  %h1 Here's some content
Run Code Online (Sandbox Code Playgroud)

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

<div itemscope itemtype='http://data-vocabulary.org/Organization'>
  <h1>Here's some content</h1>
</div>
Run Code Online (Sandbox Code Playgroud)

但这就是我实际得到的:

<div itemscope='true' itemtype='http://data-vocabulary.org/Organization'>
  <h1>Here's some content</h1>
</div>
Run Code Online (Sandbox Code Playgroud)

根据w3规范,这是无效标记.布尔属性的合法值是属性本身的名称,或者根本没有值.

这很烦人,因为我可以更改:itemscope => trueto :checked => true,它将正确地呈现checked='checked'div元素的属性列表中的属性.

我宁愿它呈现的只是最小化版本itemscope...但我不知道怎么做使用content_tag选项.我可以很容易地发送:itemscope =>'itemscope',但很难说谷歌是否会正确解释它,因为他们的所有示例和规范都显示了最小化的版本.请参阅此处:http: //www.google.com/support/webmasters/bin/answer.py?answer = 146861,了解这些属性是什么以及我使用它们的原因(微数据格式)

任何人都知道如何有效地获取任何属性在content_tag中发送一个真或假(ruby布尔值)值来呈现没有任何值而不是尝试字符串化布尔值?谢谢 :)

jak*_*ils 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)
Run Code Online (Sandbox Code Playgroud)

瞧瞧!重新启动 Rails,您应该就可以开始了。我不知道如何让这个东西只添加一个空白属性,只是如何让它像选中、禁用、只读等一样工作......

  • 我会尝试一下 - 但如果它足够聪明,能够看到“true”值并且知道你想要什么,那就太好了=p (2认同)