Rails 3 & HTML 5 Microdata - PullRequest
       2

Rails 3 & HTML 5 Microdata

5 голосов
/ 01 февраля 2011

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

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

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

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

... но я не могу создать атрибут без значения.

Ответы [ 2 ]

9 голосов
/ 01 февраля 2011

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

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

Для этого вы можете использовать:

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

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

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

3 голосов
/ 10 мая 2011

Вы можете достичь желаемого результата, если хотите переопределить приватный метод 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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...