Хэш параметров Ruby on Rails content_tag - установка логического атрибута html? - PullRequest
6 голосов
/ 10 марта 2011

Булевы атрибуты, как определено в черновой спецификации html 5:

http://dev.w3.org/html5/spec/Overview.html#boolean-attributes

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

Если атрибут присутствует, его значение должно быть либо пустой строкой, либо значением, которое является ASCII-регистронезависимым совпадением для канонического имени атрибута, без начального или конечногопробел.

Моя страница использует DTD html5.Я пытаюсь использовать помощник вида content_tag в своем собственном помощнике, но у меня возникают проблемы с передачей ему логических атрибутов.

В частности, это мой помощник:

def itemscope(type, options = {}, &block)
  content_tag(
    :div, {
      :itemscope => true,
      :itemtype => data_definition_url(type)
    }.merge(options),
    true,
    &block
  )
end

def data_definition_url(type)
  "http://data-vocabulary.org/#{type}"
end

вна мой взгляд, скажем, я называю это так (я использую хамл):

= itemscope("Organization") do
  %h1 Here's some content

Это то, что я хотел бы, чтобы это отображалось:

<div itemscope itemtype='http://data-vocabulary.org/Organization'>
  <h1>Here's some content</h1>
</div>

Но это то, чтоЯ на самом деле получаю:

<div itemscope='true' itemtype='http://data-vocabulary.org/Organization'>
  <h1>Here's some content</h1>
</div>

Это недопустимая разметка в соответствии со спецификацией w3.Допустимыми значениями для логических атрибутов являются либо имя самого атрибута, либо его вообще нет.

Это раздражает, потому что я могу изменить :itemscope => true на :checked => true, и он будет правильно отображать атрибут как checked='checked' в списке атрибутов элемента div.

Я бы предпочел, чтобы он отображал свернутую версию просто itemscope ... но я не уверен, как сделать , что используя параметры content_tag.Я мог бы очень легко отправить: itemscope => 'itemscope', но трудно сказать, будет ли это правильно интерпретироваться Google, поскольку все их примеры и спецификации показывают свернутые версии.См. Здесь: http://www.google.com/support/webmasters/bin/answer.py?answer=146861, чтобы увидеть, что это за свойства и почему я их использую (формат микроданных)

Кто-нибудь знает, как мне эффективно получить любой атрибут, отправленный в true или false (ruby boolean)значение в content_tag для отображения без какого-либо значения вместо того, чтобы пытаться преобразовать логическое значение в строковое значение?Спасибо:)

Ответы [ 2 ]

3 голосов
/ 16 марта 2016

хакерский, но простой способ: content_tag('div itemscope', ...)

2 голосов
/ 10 марта 2011

Поместите следующее содержимое в инициализатор с именем config/initializers/boolean_attributes.rb

# add any other boolean attributes to the %w() below to make them work like checked.
BOOLEAN_ATTRIBUTES = %w(itemscope).to_set
BOOLEAN_ATTRIBUTES.merge(BOOLEAN_ATTRIBUTES.map {|attribute| attribute.to_sym })
ActionView::Helpers::TagHelper::BOOLEAN_ATTRIBUTES.merge(BOOLEAN_ATTRIBUTES)

Et Voila! Перезапустите Rails, и у вас все получится. Я не знаю, как заставить эту вещь просто добавить пустой атрибут, как заставить ее работать, как проверено, отключено, доступно только для чтения и т. Д ...

...