2011-02-01 20 views
5

Raylarda, ActionView Yardımcılarının herhangi birini kullanarak HTML 5 değeri olmayan bir özellik oluşturmak mümkün mü? Google'ın BreadCrumbs için HTML 5 itemprop mikro verilerini oluşturmaya çalışıyorum.Raylar 3 ve HTML 5 Microdata

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

Ama itemscope özellik değeri hiçbir değeri yok görebilirsiniz: İşte oluşturmak istiyorum çıkışı var. İdeal olarak, ben ... Rails

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

böyle bir şey yapmak istiyorum ... ama değeri olmayan bir öznitelik oluşturmak almak gibi olamaz.

cevap

9

Hayır, yapamazsınız. Rails' tag helper, ActionView::Helpers::TagHelper::BOOLEAN_ATTRIBUTES dizisini tanımlar ve bu dizideki tüm öznitelikler key=key olarak çıkarılır; bu nedenle, tag(:input, :type => :checkbox, :checked => true) ise, çıktı <input type='checkbox' checked='checked' /> olmalıdır.

XML ayrıştırıcısının yalnızca varlığı'un varlığını kontrol edeceğinden, bunun düzgün şekilde ayrıştırılacağını varsayar, dolayısıyla herhangi bir değer çalışmalıdır. etiketinde

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

Bu irade çıkışı itemscope="itemscope" ancak çözümlenen zaman aynı istenen sonucu yaratır: Bu amaçla

şunu kullanabilirsiniz.

Alternatif olarak, BOOLEAN_ATTRIBUTES öğesine itemscope ekleyebilir, ardından :itemscope => true belirtin.

+0

Bummer. Yine de harika cevap Chris. Teşekkürler! – dhulihan

3

Özel bir Rails yöntemini geçersiz kılmak istiyorsanız, istediğiniz sonucu alabilirsiniz. Bunu yaparsanız, özel yöntem mantığını güncelleyen Rails'in sonraki sürümlerine yükseltme yaparken sorunlara neden oluyorsunuz. Hem <div itemscope ...> hem de <div itemscope="itemscope" ...> her ikisi de HTML5 özelliklerine göre geçerli olduğundan, aşağıdaki değişikliği çok az getiri sağlar. Bunu yapmak için düşünebilmemin tek nedeni, HTML kod stiliniz hakkında tamamen takıntılı olmanızdır.

Chris Heald'in dediği gibi, itemscope'u BOOLEAN_ATTRIBUTES'a ekleyeceğiz ve ardından boolean özniteliklerini değerler olmadan çıktılamak için etiket yardımcısını geçersiz kılacağız. (Aşağıdaki tag_options yöntemi Raylar gelen değiştirilir/ActionPack 3.0.7 - Gelecek okuyucular if BOOLEAN_ATTRIBUTES.include?(key) satırdan sonra değişiklik yapmak sonra çağdaş tag_options kodunu kopyalayıp olmalıdır.)

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 

Şu anda ile görünümünüzü güncelleyebilirsiniz:

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

FWIW, uzantıları mevcut sınıflara ör. lib/extensions/action_view.rb; Bu uzantılar, aşağıdakilerden oluşan config/initializers/extensions.rb tarafından yüklenir:

+0

Bu soruna yaklaşım için kod çalışmasını yaptığınız için teşekkür ederiz. İyi iş! – dhulihan