2009-10-18 2 views
0

acts_as_tree 오브젝트에 바인딩 된 라디오 버튼 목록에 대한 사용자 정의 양식 빌더를 작성하는 방법의 예제를 찾고 있습니다. 라디오 버튼 목록을 표시하지만 formbuilder로 리팩터링하여 DRY 할 수있는 코드가 이미 있습니다. 라디오 버튼 목록에 대한 사용자 정의 양식 작성기의 예제를 찾을 수 없습니다.라디오 버튼 목록에 대한 레일 사용자 정의 양식 작성기의 예

모든 포인터/링크를 부탁드립니다.

답변

2

많은 다른보기에서이 모델에 대해 form_for를 호출한다고 가정하면 모든 양식에는 동일한 라디오 버튼 세트가 있습니다. 여기에서 취할 수있는 몇 가지 경로가 있습니다. 그러나 라디오 버튼 목록을 자동으로 추가하거나 그냥 압축하는 방법을 묻는지를 알 수는 없습니다.

라디오 버튼 목록을 추가하면 공유 할 수있는 것보다 ActionView 내부에 대한 지식이 조금 더 필요합니다. 본질적으로 상황이 렌더링되는 방식을 파악하고 ActionView :: Helpers :: FormHelper의 fields_for 메소드를 재정 의하여 원하는대로 작업 할 수 있습니다. 안타깝게도 FormBuilders는 그렇게 작동하지 않습니다. 그래서 그것은 가치가있는 것보다 더 많은 문제가 될 것입니다.

더 나은 방법은 사용자 지정 양식 작성기에서 모든 라디오 단추를 생성하는 메서드를 만드는 것입니다. 변화가 생기면 간단하게하기 위해 우리는 모델에 상수를 추가 할 것입니다. 임의로 각 키가 양식의 라디오 버튼 목록으로 나타내려는 속성 메소드 인 해시가 될 것이며, 각 값은 해당 속성에 대해 허용되는 값의 목록입니다. 따라서 폼 빌더를 변경할 필요없이 여러 라디오 버튼 목록을 생성하는 것이 간단 해집니다. 추신 또한 해시를 사용하여 라디오 버튼과 관련된 모든 속성의 내용을 검증 할 수 있습니다.

/app/models/example.rb

class Example < ActiveRecord::Base 
    ... 
    RADIO_BUTTON_HASH = { 
    :attribute_a => [:accepted_value_a1, :accepted_value_a2, :accepted_value_a3], 
    :attribute_b => [:accepted_value_b1, :accepted_value_b2], 
    ... 
    } 


    def self.radio_buttons_sort(a,b) 
    # sort method to ensure that multiple radio buttons lists appear in the order you want 
    end 

    def self.radio_buttons_sorted 
    RADIO_BUTTON_HASH.sort{|a,b| radio_button_sort(a,b)} 
    end 
    ... 
end 

내가 해시에 추가 편리한 방법 중 몇 가지를 추가, 그들은 필요하지 않은하지만 그들은 출력을 표준화의 깨끗한 방법을 제공한다.

**/애플리케이션/헬퍼/example_helper.rb 모듈 ExampleHelper

# the custom FormBuilder 
    class ExampleFormBuilder < ActionView::Helpers::FormBuilder  

    # add onkeypress and set maxlength of field to 3 to all text fields 
    def radio_button_list(options={}) 
     Example.sorted_radio_buttons.each do |method,values| 
     values.each do |value| 
      radio_button(method, value, options) 
     end 
     end 
    end 

    end 
end 

이어서 (예 컨트롤러에 의해 렌더링 관점에서 기본적으로 수행) ExampleHelper을 포함하는 도면에서.

<%form_for @example, :builder => ExampleFormBuilder do |f| %> 
    ... 

    <%=f.radio_button_list %> 
<%end%> 
+0

답장을 보내 주셔서 감사합니다. 지난 밤에 레일 헬퍼를 통해 몇 시간을 시험해보고 나서 비슷한 해결책을 찾았습니다. – Damian

+0

그래, 공식 문서는이 주제에별로 도움이되지 않습니다. 짧은 버전은 사용자 정의 FormBuilders를 사용하여 옵션으로 FormHelper 메소드를 대체하거나 새로운 도우미 메소드를 작성하는 것입니다. – EmFi