Ruby on rails RubyonRails内容\标记选项哈希-设置布尔html属性?

Ruby on rails RubyonRails内容\标记选项哈希-设置布尔html属性?,ruby-on-rails,view,html-helper,view-helpers,Ruby On Rails,View,Html Helper,View Helpers,html 5规范草案中定义的布尔属性: 上存在布尔属性 元素表示真实值, 以及属性的缺失 表示假值 如果属性存在,则其值 必须是空字符串或 值,该值是ASCII码 不区分大小写的匹配 属性的规范名称,不带 前导或尾随空格 我的页面正在使用html5 DTD。我试图在自己的助手中使用content_tag view助手,但在向其传递布尔属性时遇到问题 具体来说,这是我的助手: def itemscope(type, options = {}, &block) content_tag(

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

上存在布尔属性 元素表示真实值, 以及属性的缺失 表示假值

如果属性存在,则其值 必须是空字符串或 值,该值是ASCII码 不区分大小写的匹配 属性的规范名称,不带 前导或尾随空格

我的页面正在使用html5 DTD。我试图在自己的助手中使用content_tag view助手,但在向其传递布尔属性时遇到问题

具体来说,这是我的助手:

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):

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

<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\u标记选项来实现这一点。我可以很容易地发送:itemscope=>'itemscope',但很难说谷歌是否能正确解释这一点,因为他们的所有示例和规范都显示了最小化版本。请参见此处:查看这些属性是什么以及我使用它们的原因(微数据格式)


有人知道我如何有效地让任何属性在content_标记中发送一个true或false(ruby boolean)值,以便在没有任何值的情况下呈现,而不是尝试字符串化布尔值吗?谢谢:)

将以下内容放入名为
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等一样工作。

这是一个简陋但简单的方法:
content\u标签('div itemscope',…)

听起来像是一个很好的补丁:)尽管在这种情况下补丁是为HAML设计的,而不是Rails。不,问题在于Rails的content_tag helper和相关函数,而不是HAML。我将对此进行一次尝试——但如果它足够聪明,能够看到“true”的值,并且只知道你想要什么=pindect,那就太好了。我们已经习惯了“Rails魔术”,但它没有达到我们预期的效果,这让人失望。但我认为这样做是有原因的,因为将自定义属性(比如“data-is\u active”)设置为true,我们希望在javascript中看到该属性的真值或假值,而不是“data-is\u active”==“data-is\u active”,我同意@nzifnab,如果您提供一个布尔Ruby值(true或false),那么它应该足够聪明,可以将其视为一个兼容的布尔HTML属性。如果您想要文本字符串'true'或'false',那么提供Ruby值'true'或'false'!
# 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)