2011-02-01 2 views
5

В Rails можно создать атрибут HTML 5 без значения с помощью любого из помощников ActionView? Я пытаюсь создать микроданные HTML5 itemprop для Google BreadCrumbs. Вот вывод я хотел бы произвести:Rails 3 & HTML 5 Microdata

<div itemscope itemtype="http://data-vocabulary.org/Breadcrumb"></div> 

Но вы можете увидеть, что значение атрибута itemscope не имеет никакого значения. В идеале я хотел бы сделать что-то подобное в Rails ...

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

... но я не могу показаться, чтобы получить генерировать атрибут без значения.

ответ

9

Нет, вы не можете. Rails' tag helper определяет массив ActionView::Helpers::TagHelper::BOOLEAN_ATTRIBUTES, и любые атрибуты в этом массиве будут выводиться как key=key, поэтому, если бы у вас было, скажем, tag(:input, :type => :checkbox, :checked => true), выход должен быть <input type='checkbox' checked='checked' />.

Я предполагаю, что это правильно анализирует, так как синтаксический анализатор XML просто проверяет наличие атрибута, поэтому любое значение должно работать.

С этой целью вы можете использовать:

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

Это выведет на экран itemscope="itemscope" в теге, но это должно привести к тому же желаемому эффекту при разобрано.

В качестве альтернативы вы можете добавить itemscope в BOOLEAN_ATTRIBUTES, а затем указать :itemscope => true.

+0

Bummer. Отличный ответ, хотя, Крис. Благодаря! – dhulihan

3

Вы можете добиться желаемого результата, если хотите отказаться от частного метода 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} 
+0

Спасибо за то, что вы делаете код для работы над этой проблемой. Хорошая работа! – dhulihan

Смежные вопросы