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