Rails 3和HTML 5 Microdata

在Rails中,是否可以使用任何ActionView助手创建HTML 5无值属性? 我正在尝试为谷歌的BreadCrumbs创建HTML 5 itemprop微数据。 这是我想要生成的输出:

但是您可以看到itemscope属性值没有值。 理想情况下,我想在Rails中做这样的事情……

 content_tag(:div, "somecontent", :itemscope => nil, :item_type => "http://data-vocabulary.org/Breadcrumb") 

…但我似乎无法生成没有值的属性。

不,你不能。 Rails的标记助手定义了一个ActionView::Helpers::TagHelper::BOOLEAN_ATTRIBUTES数组,该数组中的任何属性都将以key=keyforms输出,所以如果你有,比如tag(:input, :type => :checkbox, :checked => true) ,输出应为

我认为这可以正确解析,因为XML解析器只是检查属性的存在 ,所以任何值都应该有效。

为此,您可以使用:

 content_tag(:div, "somecontent", :itemscope => "itemscope", :item_type ... 

这将在标签中输出itemscope="itemscope" ,但在解析时应该产生相同的预期效果。

或者,您可以将itemscope添加到BOOLEAN_ATTRIBUTES,然后指定:itemscope => true

如果您愿意覆盖私有Rails方法,则可以获得所需的结果。 如果执行此操作,则在升级到更新私有方法逻辑的Rails的未来版本时,存在导致问题的风险。 由于

根据HTML5规范有效,因此下面的更改几乎没有收益。 我能想到的唯一原因就是你对HTML代码风格完全痴迷。

正如Chris Heald所说,我们将把itemscope添加到BOOLEAN_ATTRIBUTES ,然后覆盖标签帮助器以输出没有值的布尔属性。 (以下tag_options方法是从Rails / ActionPack 3.0.7修改的 – 未来的读者应该复制当前的tag_options代码,然后在if BOOLEAN_ATTRIBUTES.include?(key)行之后进行更改。)

 module ActionView module Helpers module TagHelper BOOLEAN_ATTRIBUTES.merge(['itemscope', :itemscope]) private def tag_options(options, escape = true) unless options.blank? attrs = [] options.each_pair do |key, value| if BOOLEAN_ATTRIBUTES.include?(key) attrs << key.to_s if value elsif !value.nil? final_value = value.is_a?(Array) ? value.join(" ") : value final_value = html_escape(final_value) if escape attrs << %(#{key}="#{final_value}") end end " #{attrs.sort * ' '}".html_safe unless attrs.empty? end end end end end 

您现在可以使用以下内容更新视图:

 content_tag(:div, "somecontent", :itemscope => true, :item_type => "http://data-vocabulary.org/Breadcrumb" 

FWIW,我存储了现有类的扩展,例如lib/extensions/action_view.rb ; 这些扩展由config/initializers/extensions.rb加载,包括:

 Dir[File.join(Rails.root, 'lib', 'extensions', '*.rb')].each {|f| require f}