2017-10-26 2 views
0

내가 원하는 것에 도달하기위한 더 좋은 방법이 있습니까?반 글로벌 레일 부분

  • /views/shared/ 폴더에는 전자 메일을 보내는 데 사용되는 양식의 모든 필드가 들어 있습니다.
  • 부분을 렌더링하는 기본 옵션이있는 도우미 메서드 (render partial: 'shared/email_fields' locals: locals 여기서 locals은 기본 변수의 해시 임).
  • 위의 도우미 메서드를 호출하고 FormBuilder 개체 또는 name html 특성의 시작을 포함하는 문자열을 전달하는 전자 메일을 보내는 모든 도우미 메서드에 대한 도우미 메서드입니다.

나는 데 문제 : 이메일 형태의 대부분은 약간 나를 locals 해시에 추가 옵션을 추가 할 필요에 어떤 결과 차이가 나는 글로벌 부분 같은 느낌이 부풀어되고있다. 이 방법으로 전역 부분을 사용하여 부분이 너무 부 풀리지 않도록하는 방법이 있습니까?

각 양식이 완전히 분리되어 있다고 생각했지만 유지 보수와 DRY에는 좋지 않습니다. 전 세계적으로 부분적으로 표현할 부분의 이름을 전달할 생각이었습니다. 그러나 이러한 형식 중 일부는 동일한 옵션이 필요하고 다른 컨트롤러에서 렌더링되기 때문에 일부는 아닌 부분 집합을 넣고 싶지는 않습니다. 글로벌은 /views/shared/ 폴더에 있습니다. 지금 당장, 나는 비 대한 글로벌 부분만을 고수하고 있습니다.

도움이 될 것입니다.

답변

1

내가 어떻게하는지. 이상하게 들리 겠지만 나와 함께 견뎌야합니다.

그래서 내 응용 프로그램에는 기본적으로 두 가지 형식이 있습니다. 자바 스크립트를 통해 제출하는 양식의 경우 다음과 같습니다.

#views/shared/_remote_form.html.haml 

= form_tag @presenter.form_path, 
    remote: true, 
    id: @presenter.form_id, 
    class: @presenter.form_classes, 
    data: @presenter.form_data, 
    method: @presenter.form_method do 
    .well 
     = @presenter.form_inner 
     .form-controls-container 
     .form-controls-wrapper 
      = @presenter.form_controls 

자세히 알 수 있듯이 발표자를 사용합니다. 발표자는 관련 컨트롤러에서 컨트롤러 변수로 인스턴스화되므로 발표자는 부분에 사용할 수 있습니다. 다음과 같음 :

class FooController < ApplicationController 

    def new 
    @presenter = NewFooFormPresenter.new(self) 
    render partial: 'shared/remote_form' 
    end 

    ... 

end 

발표자가 양식의 다양한 부분을 렌더링 할 수 있도록 컨트롤러를 전달하고있는 것을 볼 수 있습니다.

모두 FormPresentersFormPresenterBase에서 양식을 호출하는 각 메소드에 대해 메소드를 스터 빙한 것입니다. 이런 식으로 :

class FormPresenterBase 

    def initialize(controller) 
    @controller = controller 
    end 

    def form_path 
    root_path 
    end 

    def form_id 
    'bogus-form-id' 
    end 

    def form_classes 
    'something-bogus' 
    end 

    def form_inner; end 

    def form_controls; end 

    ... 

end 

그게 내가 항상 오류 묶음을 던지지 않고 양식을 부트 스트랩하자. 당연히 그 스텁 된 폼은 실제로 작동하지 않을 것이지만, 각 FormPresenter가 스텁 된 메소드를 실제 값으로 오버라이드하기 때문에 괜찮습니다. 그래서, 다음과 같은 것이 있습니다 :

물론, 저는 FormPresenters로 까다로울 수 있습니다.공통 메소드를 공유하는 패밀리가있는 경우 모든 상속을 유지하기 위해 상속 또는 모듈 포함을 사용할 수 있습니다.

일단 모든 기본 양식 위젯 (필드 조합, 컨트롤 등)을 부분으로 구성한 후에는 발표자에서 내 마음의 기쁨에 섞어서 일치시킬 수 있습니다. 그리고 (적어도 양식을 위해서), 나는 기본적으로 내 인생의 다른 부분을 쓸 필요가 없습니다. 새로운 변종이 필요할 때마다 새로운 FormPresenter를 만들어서 원하는 양식을 제공하도록 사용자 정의합니다.

실제로이 모든 것보다 더 많은 것이 있지만 잘하면이 방법으로 고양이를 피부에 감을 수 있습니다.

+0

레일 5 것입니까? (우리는 4.2.5에만 있습니다.) 이전에 발표자 나 발표자에 관해 들어 본 적이 없습니다. –

+0

아니요, '발표자'는 패턴입니다. 그것들은 보통의 오래된 루비 객체입니다. Ryan Bates는 주제에 대해 Rails Cast를 소개합니다. 최근에 "Widget"이라는 완전히 새로운 사용자 정의 PORO 클래스를 작성하여 응용 프로그램을 더 구성하게되었습니다. 그러나 그것은 완전히 다른 미친 이야기입니다. – jvillian

+1

처음에는 매우 이상하게 보였지만 Rails Cast를 본 후 이것이 어떻게 될 것인가. 정보 주셔서 감사합니다! –

0

접근 방식은 각 양식에 대해 별도의 부분을 갖는 것입니다. 양식에 공통으로 포함 된 모든 항목을 가져 와서 부분에 넣으십시오. 그런 다음 개별 부분 부분 내에서 "공통 항목"부분을 참조 할 수 있습니다. 양식 구성 방법에 따라 여러 개의 "공통 항목"부분이있을 수 있지만 괜찮습니다. 목표는 코드를 정리하고 DRY 상태로 유지하는 것입니다.