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=key
forms输出,所以如果你有,比如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}