8 Stimmen

Ruby on Rails content_tag options hash - Setzen eines booleschen html-Attributs?

Boolesche Attribute, wie im Entwurf der html 5-Spezifikation definiert:

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

Das Vorhandensein eines booleschen Attributs auf einem Element stellt den wahren Wert dar, und das Nichtvorhandensein des Attributs steht für den falschen Wert.

Wenn das Attribut vorhanden ist, wird sein Wert entweder die leere Zeichenkette oder ein Wert sein, der ein ASCII Groß- und Kleinschreibung für den kanonischen Namen des Attributs ist, ohne führende oder nachgestellte Leerzeichen.

Meine Seite verwendet die html5 DTD. Ich versuche, die content_tag-Ansichtshilfe in einer eigenen Hilfe zu verwenden, aber ich habe Probleme mit der Übergabe von booleschen Attributen an sie.

Das ist insbesondere mein Helfer:

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

Meiner Ansicht nach könnte ich es so nennen (ich verwende haml):

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

Ich möchte, dass es so dargestellt wird:

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

Aber das ist es, was ich tatsächlich bekomme:

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

Dies ist nach der w3-Spezifikation eine ungültige Auszeichnungsform. Legale Werte für boolesche Attribute sind entweder der Name des Attributs selbst oder gar kein Wert.

Das ist ärgerlich, denn ich kann die :itemscope => true a :checked => true und es wird das Attribut korrekt als checked='checked' in der Attributliste des div-Elements.

Ich würde es vorziehen, nur die minimierte Version von itemscope ...aber ich bin mir nicht sicher, wie ich das machen soll dass unter Verwendung der content_tag-Optionen. Ich könnte ganz einfach :itemscope => 'itemscope' senden, aber es ist schwer zu sagen, ob das von Google richtig interpretiert wird, da alle Beispiele und Spezifikationen die minimierten Versionen zeigen. Siehe hier: http://www.google.com/support/webmasters/bin/answer.py?answer=146861 um zu sehen, was diese Eigenschaften sind und warum ich sie verwende (Microdata-Format)

Jemand wissen, wie ich effektiv jedes Attribut gesendet ein true oder false (Ruby Boolean) Wert in content_tag ohne Wert zu rendern, anstatt zu versuchen, den booleschen Wert zu stringifizieren? Danke :)

3voto

jakeonrails Punkte 1845

Fügen Sie den folgenden Inhalt in einen Initialisierer namens 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! Starten Sie Rails neu und Sie sollten startklar sein. Ich weiß nicht, wie man das Ding nur ein leeres Attribut hinzufügen, nur, wie man es funktionieren wie überprüft, deaktiviert, nur lesen, etc...

3voto

Anthony Wang Punkte 1127

Auf die einfache, aber umständliche Art: content_tag('div itemscope', ...)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X