내가 어떻게하는지. 이상하게 들리 겠지만 나와 함께 견뎌야합니다.
그래서 내 응용 프로그램에는 기본적으로 두 가지 형식이 있습니다. 자바 스크립트를 통해 제출하는 양식의 경우 다음과 같습니다.
#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
발표자가 양식의 다양한 부분을 렌더링 할 수 있도록 컨트롤러를 전달하고있는 것을 볼 수 있습니다.
모두 FormPresenters
은 FormPresenterBase
에서 양식을 호출하는 각 메소드에 대해 메소드를 스터 빙한 것입니다. 이런 식으로 :
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를 만들어서 원하는 양식을 제공하도록 사용자 정의합니다.
실제로이 모든 것보다 더 많은 것이 있지만 잘하면이 방법으로 고양이를 피부에 감을 수 있습니다.
레일 5 것입니까? (우리는 4.2.5에만 있습니다.) 이전에 발표자 나 발표자에 관해 들어 본 적이 없습니다. –
아니요, '발표자'는 패턴입니다. 그것들은 보통의 오래된 루비 객체입니다. Ryan Bates는 주제에 대해 Rails Cast를 소개합니다. 최근에 "Widget"이라는 완전히 새로운 사용자 정의 PORO 클래스를 작성하여 응용 프로그램을 더 구성하게되었습니다. 그러나 그것은 완전히 다른 미친 이야기입니다. – jvillian
처음에는 매우 이상하게 보였지만 Rails Cast를 본 후 이것이 어떻게 될 것인가. 정보 주셔서 감사합니다! –