2014-03-28 4 views
6

기본 양식 빌더를 하위 클래스로 분류하여 몇 가지 추가 방법을 추가했습니다. 샘플 코드는 다음과 같습니다. 을 변경 이론적으로는 가능처럼레일 4, 기본 양식 빌더를 전체적으로 변경하십시오.

module ApplicationHelper 
    class AppFormBuilder < ActionView::Helpers::FormBuilder 
     def coordinates_field(method, options = {}) 
      options[:readonly] = 'true' 
      .... 
      @template.text_field(@object_name, method, objectify_options(options)) 
     end 
    end 
end 

이 잘 작동하지만, 나는 coordinates_field 방법을 사용하는 모든 형태, 즉의 뷰 코드를 변경해야 그것을 사용하기는

<%= form_for @object, :builder => ApplicationHelper::AppFormBuilder do |f| %> 
... 
<% end %> 

소리가 난다 전 세계적으로 기본 양식 작성 도구 (config.action_view.default_form_builder)를 사용하고 있지만이 기능을 사용할 수없는 것 같습니다. 이것은 내가 /config/application.rb에서 시도한 것입니다 : 문자열을 나는 양식을 가진보기를 쳤을 때 "ApplicationHelper :: AppFormBuilder"에 대한 '새로운'오류 정의되지 않은 메서드 결과

module Web 
    class Application < Rails::Application 
    ... 
    config.action_view.default_form_builder = "ApplicationHelper::AppFormBuilder" 
    end 
end 

.

내가 대신 내가 응용 프로그램을 시작 오류 * config.action_view.default_form_builder = ApplicationHelper :: AppFormBuilder *를 얻을이

config.action_view.default_form_builder = ApplicationHelper::AppFormBuilder 

을 시도하십시오.

아무에게도 이것이 작동하도록하는 방법에 대한 지침을 제공 할 수 있습니까?

답변

3

ApplicationHelper::AppFormBuilder은 아직 application.rb가로드 될 때 필요하지 않습니다. 당신은 (구성 \ 이니셜을 만듭니다) 별도의 초기화 파일에 넣고 시도 할 수 있습니다 :

module Web 
    class Application 
    ActionView::Base.default_form_builder = AppFormBuilder 
    end 
end 
+0

감사합니다 맥스, 그게 – Mike

1

당신은 다른 설정 옵션처럼 이니셜 라이저에서이 설정 할 수 있어야한다. config/initializers/ 아래에 default_form_builder.rb 파일을 만듭니다. 구문은 @ Max의 대답보다 간단해야합니다.

Rails.application.config.action_view.default_form_builder = AppFormBuilder 

나는 이것을 도우미에 포함시키지 말 것을 제안합니다. /lib 디렉토리 안에 별도의 클래스로 추가하십시오. 내부에 포함 된 모듈 앞에 접두어를 붙이거나하지 않아도됩니다.

마지막으로 you can set this globally에서 config/application.rb까지이지만 레일이 시작될 때 클래스가로드되지 않을 수 있으므로 문자열로 전달해야합니다.

config.after_initialize do 
    ActionView::Base.default_form_builder = MyCustomHelper::MyCustomFormBuilder 
end 

분명히 당신이 이름을 대체 MyCustomHelper과이 직접 설정/application.rb에 해당하고 청소기 내가 믿는

config.action_view.default_form_builder = 'AppFormBuilder' 
+0

왜'/ app/helper' 대신'/ lib'에 넣을까요? –

+0

더 간단한 구문의 초기화 프로그램은'rails server'와 함께 오류를 생성했습니다 :'bin/rails : 6 : warning : 이미 초기화 된 상수 APP_PATH bin/rails : 6 : warning : APP_PATH의 이전 정의가 여기에 있습니다. –

+0

위의 오류는 내 AppFormBuilder를 찾을 수 없다는 또 다른 방법입니다. 'rails console'이 더 나은 오류 메시지를 생성했습니다. –

3

나는 (YMMV 있도록 n00b 여기 레일) 최대의 답변을 좋아하지만, MyCustomFormBuilder.

은 잘 정리 된 레일 문서 덕분에이 사실을 파악하는 데 약 48 시간이 걸렸습니다.

+0

이 작동하지만, 모든 변경에 대해 서버를 다시 시작해야합니다 ... – d4n3

+0

@ d4n3 사실이긴하지만 Max의 솔루션도 마찬가지입니다. – pricj004

6

official docs에서 언급했듯이 레일 5에서 올바른 방법은 컨트롤러에 지정하는 것입니다. 그것은 넓은 신청하려면, 당신의 ApplicationController 설정 :

class ApplicationController < ActionController::Base 
    default_form_builder AppFormBuilder 
end 

이 훨씬 더 의미가 있습니다.FormHelpers는 뷰 레이어의 일부이며 응용 프로그램 구성 요소가 아닙니다.