2011-03-10 11 views
6

Boole özellikler, html 5 taslak tarifnamede tanımlandığı gibiRuby on Rails content_tag seçenekleri karma - bir boolean html özniteliği mi ayarlıyorsunuz?

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

bir eleman gerçek değeri, ve öznitelik olmadığını temsil bir Boole öznitelik varlığı temsil eder yanlış değer.

nitelik varsa, değeri ya boş bir dize veya lider veya sonlarındaki boşluk hiçbir ile özniteliğin kurallı adı için bir ASCII harf duyarsız eşleşme bir değer olmalıdır.

Sayfam html5 DTD kullanıyor. İçerik_tag görünümü yardımcısını kendi kendime ait bir yardımcıda kullanmaya çalışıyorum, ancak boolean özniteliklerini geçirmeyle ilgili sorunlarım var. Bence

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 

, ı (ı Haml kullanıyorum) böyle diyoruz diyelim:

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

Bu onu istiyorum olacaktınız

Özellikle bu benim yardımcısıdır

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

Ama bu aslında alıyorum budur: işlemek için

w3 şartnamesine uygun geçersiz biçimlendirme
<div itemscope='true' itemtype='http://data-vocabulary.org/Organization'> 
    <h1>Here's some content</h1> 
</div> 

. Boole özniteliklerinin yasal değerleri, özniteliğin kendisinin adıdır veya hiç değer içermez.

Ben :checked => true için :itemscope => true değiştirebilir ve doğru div öğesinin öznitelik listesinde checked='checked' olarak özelliğini verecek çünkü sinir bozucu.

Yalnızca itemscope'un küçültülmüş sürümünü oluşturmayı tercih ediyorum ... ancak içerik_tag seçenekleriyle'un numarasını nasıl yapacağını bilmiyorum. Çok kolay bir şekilde gönderebilirim: itemscope => 'itemscope' ancak google tarafından doğru şekilde yorumlanıp yorumlanamayacağını söylemek zor çünkü tüm örnek ve teknik özellikleri minimize edilmiş sürümleri gösteriyor. Bu özelliklerin ne olduğunu ve neden bunları kullandığını görmek için (bkz: Microdeta biçimi) http://www.google.com/support/webmasters/bin/answer.py?answer=146861 (Microdata biçimi)

İçerik_tarafında herhangi bir özniteliğin doğru veya yanlış (ruby boolean) değeri nasıl gönderilebileceğini bilen herkes değeri, boolean değerini dizgemeye çalışmak yerine? Teşekkür :)

+0

bir yama için harika bir fikir gibi geliyor :) yama bu durumda değil Rails haml olurdu rağmen. –

+2

Hayır, sorun Rails'in content_tag yardımcısı ve HAML değil ilgili işlevlerle ilgilidir. – jakeonrails

cevap

2

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 adlı bir başlatıcısı içine aşağıdaki içeriği koy! Rayları Yeniden Başlat ve gitmek için iyi olmalısın. Sadece boş bir öznitelik eklemek nasıl bilmiyorum, sadece nasıl kontrol, devre dışı bırakılmış, readonly, vb gibi çalışmak ...

+2

Ben bunu bir şans vereceğim - ama 'gerçek' değerini görmek için yeterince akıllı olsaydı ve sadece ne istediğini bilirsin = p – nzifnab

+0

gerçekten çok iyi olurdu. hayal kırıklığını beklediğimiz şeyi yapalım. ama sanırım bunu bir sebepten dolayı yapar, çünkü özel öznitelikleri ("veri-is_aktifini" düşün) doğru olarak ayarladığımızdan, javascript içinde bekleriz, örneğin "data-is_active" yerine o öznitelik üzerinde doğru ya da yanlış bir değer görmeyi beklerdik == "data-is_active" – jakeonrails

+1

@nzifnab ile katılıyorum, boolean bir Ruby değeri (true veya false) sağlamanız durumunda, bunu uyumlu bir boole HTML özniteliği olarak değerlendirmek için yeterince akıllı olması gerekir. Eğer '' gerçek '' ya da '' yanlış '' harfini istiyorsanız, o zaman 'gerçek' ya da 'yanlış' olan Ruby değerlerini sağlayın! –

3

hacky ama kolay yolu: content_tag('div itemscope', ...)