2010-03-19 3 views
2

일부 로직을 FormBuilder로 옮겨 일부 코드를 압축하려고합니다. 선택 양식 및 대체 양식 작성기에 대한 설명서를 읽은 후 저를위한 논리적 솔루션은 이와 비슷한 것으로 보였습니다. 보기ActionView :: Helpers :: FormBuilder를 확장하려고 시도합니다.

<% form_for @event, :builder => TestFormBuilder do |f| %> 
    <%= f.test %> 
    <%= f.submit 'Update' %> 
<% end %> 

에서

다음 응용 프로그램에서

/도우미/application_helper.rb

module ApplicationHelper 
    class TestFormBuilder < ActionView::Helpers::FormBuilder 
     def test 
      puts 'apa' 
     end 
    end 
end 

이것은, 그러나,

uninitialized constant ActionView::Base::CompiledTemplates::TestFormBuilder 
"form_for"에서 나에게 오류를 제공

어디에서 잘못 했습니까?

form_for @event, :builder => ApplicationHelper::TestFormBuilder do |f| 

답변

5

함께 시도 : 여기

# app/views/events/_form_in.html.erb 
    form_for @event, :builder => EventsHelper::FormBuilderIn do |f| 

    # app/views/events/_form_out.html.erb 
    form_for @event, :builder => FormBuilderOut do |f| 

는 양식 빌더 옵션을 설정 도우미 방법 :

,
# app/helpers/events_helper.rb 
    module EventsHelper 
     def form_in_for(data, *args, &proc) 
      options = args.extract_options! 
      form_for(data, *(args << options.merge(:builder => EventsHelper::FormBuilderIn)), &proc) 
     end 
     def form_out_for(data, *args, &proc) 
      options = args.extract_options! 
      form_for(data, *(args << options.merge(:builder => FormBuilderOut)), &proc) 
     end 
    end 
    ... 

지금, 양식 빌더를 연결하는 선택 방법이 : 마지막으로

# app/views/events/_form_in.html.erb 
    form_in_for @event do |f| 

    # app/views/events/_form_out.html.erb 
    form_out_for @event do |f| 

, 사용자 정의 빌더는 예를 들어, 분리 된 폴더에 저장 될 수있다 "응용 프로그램/빌더"하지만,이 요구는 수동으로 추가 응용 프로그램 환경으로의이 경로. 레일 인 2.3.x의 경우, 설정 : 당신이 http://guides.rubyonrails.org/configuring.html#configuring-action-view에서 볼 수 있듯이

# config/environment.rb. 
    config.load_paths += %W(#{RAILS_ROOT}/app/builders) 
+0

감사합니다. 그게 효과가 있었어. 이 문서가 어딘가에 있습니까? 아니면 레일 구조에서 뭔가를 놓쳤습니까? –

+0

클래스를 정의해야합니다. 따라서 ApplicationHelper에 배치 할 필요가 없습니다. 그래서 당신은 당신의 라이브러리에 클래스를 넣고 네임 스페이스없이 사용할 수 있습니다. – shingara

+0

이것보다 우아한 방법이 있습니까? – JohnMerlino

4

빌더 클래스는 다음과 같이 및/또는 외부 모듈 정의 내부 모듈 파일에 배치 할 수 있습니다 : :입니다 형성 빌더를 첨부 할 수

# app/helpers/events_helper.rb 
    module EventsHelper 
     ... 
     class FormBuilderIn < ActionView::Helpers::FormBuilder 
      ... 
     end 
    end 
    class FormBuilderOut < ActionView::Helpers::FormBuilder 
     ... 
    end 

적절한 방법을

4

, 당신은 기본적으로 당신의 전체 응용 프로그램에 대한 FormBuilder - 클래스를 설정할 수 있습니다. 귀하의 경우 :

config.action_view.default_form_builder = "ApplicationHelper::TestFormBuilder"