2011-03-10 13 views
6

atributos booleanos, como se define en el html 5 borrador de la especificación:Ruby on Rails content_tag options hash - ¿configura un atributo booleano html?

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

La presencia de un atributo booleano en un elemento representa el valor verdadero, y la ausencia del atributo representa la valor falso

Si el atributo está presente, su valor debe ser la cadena vacía o un valor que es una coincidencia entre mayúsculas y minúsculas ASCII de nombre canónico del atributo , sin iniciales o finales espacios en blanco.

Mi página utiliza la DTD html5. Estoy intentando utilizar la vista content_tag ayudante en un ayudante de la mía, pero estoy teniendo problemas con el paso de los atributos booleanos a ella.

En concreto este es el que me ayuda

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 

mi punto de vista, digamos que yo lo llamo así (estoy usando haml):

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

Esto es lo que me gustaría que se para rendir:

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

Pero esto es lo que estoy realmente conseguir:

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

Cuál es marcado válido de acuerdo con la especificación W3. Los valores legales para los atributos booleanos son el nombre del atributo en sí o ningún valor.

Es molesto porque puedo cambiar el :itemscope => true al :checked => true y representará correctamente el atributo como checked='checked' en la lista de atributos del elemento div.

preferiría que para hacer la versión minimizada de poco itemscope ... pero no estoy seguro de cómo hacer que utilizando las opciones content_tag. Podría muy fácilmente enviar: itemscope => 'itemscope' pero es difícil decir si eso va a ser interpretado correctamente por Google, ya que todos sus ejemplos y especificaciones muestran las versiones minimizadas. Vea aquí: http://www.google.com/support/webmasters/bin/answer.py?answer=146861 para ver cuáles son estas propiedades y por qué las estoy usando (formato de microdatos)

Cualquiera sabe cómo puedo obtener efectivamente cualquier atributo enviado un valor verdadero o falso (ruby boolean) en content_tag para representar sin ningún valor en lugar de tratar de stringify el valor booleano? Gracias :)

+0

suena como una gran idea para un parche :) Aunque el parche sería para HAML en este caso, no rieles. –

+2

No, el problema radica en el complemento content_tag de Rails y las funciones relacionadas, no en HAML. – jakeonrails

Respuesta

2

Ponga el siguiente contenido en un inicializador llamada 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! Reinicia Rails y deberías estar listo para continuar. No sé cómo hacer que la cosa sólo tiene que añadir un atributo en blanco, sólo la forma de hacer que funcione como está marcado, personas con discapacidad, de sólo lectura, etc ...

+2

Voy a dar una oportunidad, pero sería bueno si fuera lo suficientemente inteligente como para ver el valor "verdadero" y simplemente saber lo que quería = p – nzifnab

+0

de hecho, nos acostumbramos tanto a "rails magic" cuando no lo hace hacemos lo que esperamos que sea decepcionante. pero creo que lo hace por una razón, ya que al establecer atributos personalizados (piense "data-is_active") en verdadero esperaríamos en javascript, por ejemplo, ver un valor verdadero o falso en ese atributo en lugar de "data-is_active" == "data-is_active" – jakeonrails

+1

Estoy de acuerdo con @nzifnab, debe ser lo suficientemente inteligente como para tratarlo como un atributo HTML booleano compatible si proporciona un valor booleano de Ruby (verdadero o falso). Si quiere la cadena literal 'verdadera' o 'falsa', ¡entonces proporcione los valores Ruby 'verdadero' o 'falso'! –

3

la manera hacky pero fácil: content_tag('div itemscope', ...)