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