Вы можете достичь желаемого результата, если хотите переопределить приватный метод Rails. Если вы сделаете это, вы рискуете вызвать проблемы при обновлении до будущих версий Rails, которые обновляют логику закрытого метода. Поскольку оба значения <div itemscope ...>
и <div itemscope="itemscope" ...>
действительны в соответствии со спецификацией HTML5, внесенные ниже изменения принесут очень мало пользы. Единственная причина, по которой я могу подумать, это сделать, если вы полностью одержимы своим стилем HTML-кода.
Как сказал Крис Хилд, мы добавим 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}