2011-02-01 8 views
5

레일즈에서 ActionView Helpers를 사용하여 HTML 5 값없는 속성을 만들 수 있습니까? Google의 BreadCrumbs에 대한 HTML 5 itemprop 마이크로 데이터를 만들려고합니다.레일 3 및 HTML 5 마이크로 데이터

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

하지만 당신은 의 itemscope 속성 값은 값이없는 것을 볼 수 있습니다 여기에 내가 생성하고자하는 출력입니다. 이상적으로 레일즈에서 이와 같은 작업을하고 싶습니다 ...

...하지만 값없이 속성을 생성 할 수 없습니다.

답변

9

아니요, 불가능합니다. Rails' tag helperActionView::Helpers::TagHelper::BOOLEAN_ATTRIBUTES 어레이를 정의하고 해당 배열의 모든 속성은 key=key으로 출력되므로 tag(:input, :type => :checkbox, :checked => true)이라고 입력하면 <input type='checkbox' checked='checked' />이됩니다.

XML 파서가 속성의 존재 여부를 확인하기 만하면 모든 값이 작동하므로이 구문 분석이 적절하다고 가정합니다. 태그에

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

이 출력됩니다 itemscope="itemscope"을하지만, 구문 분석시 동일한 원하는 효과를 초래한다 :이를 위해

, 당신은 사용할 수 있습니다.

또는 itemscope를 BOOLEAN_ATTRIBUTES에 추가 한 다음 :itemscope => true을 지정할 수 있습니다.

+0

Bummer. 좋은 대답, 크리스. 감사! – dhulihan

3

개인 레일스 방법을 재정의하려는 경우 원하는 결과를 얻을 수 있습니다. 이렇게하면 개인 메서드 논리를 업데이트하는 이후 버전의 Rails로 업그레이드 할 때 문제가 발생할 위험이 있습니다. <div itemscope ...><div itemscope="itemscope" ...>은 HTML5 사양에 따라 유효하므로 아래 변경을 수행하는 데는 거의 보상이 없습니다. 내가 이것을 할 수있는 유일한 이유는 당신이 HTML 코드 스타일에 완전히 집착하고 있다는 것입니다.

Chris Heald가 말했듯이 itemscopeBOOLEAN_ATTRIBUTES을 추가 한 다음 값이없는 부울 특성을 출력하도록 태그 도우미를 재정의합니다. (다음 tag_options 방법은 레일에서 수정/ActionPack 3.0.7 - 미래의 독자가 if BOOLEAN_ATTRIBUTES.include?(key) 라인 후 변경 후 현대 tag_options 코드를 복사해야합니다.)

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 

당신은 이제 당신의보기를 업데이트 할 수 있습니다

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

FWIW, 나는 기존 클래스의 확장을 예 : lib/extensions/action_view.rb; 이 확장은 에 의해로드되며 다음으로 구성됩니다.

Dir[File.join(Rails.root, 'lib', 'extensions', '*.rb')].each {|f| require f} 
+0

이 문제에 대한 접근법에 대한 코드 연습을 해주셔서 감사합니다. 잘 하셨어요! – dhulihan