2013-07-31 2 views
22

7 Patterns to Refactor Fat ActiveRecord Models - 여기에는 PORO를 사용하는 다양한 리팩터링 접근법에 대한 훌륭한 기사가 있습니다. 3 번째 캡션에는 Form Object Pattern이 있는데, 저는이 프로젝트 중 하나에서 실제로 좋아하고 이미 구현했습니다. 하나의 중첩 된 리소스를 사용하는 예제가 있지만 여러 중첩 된 리소스에 대해이 패턴을 구현하고 싶습니다. 어쩌면 여기 누군가가 이미이 문제를 다루었을 것입니까? 필자는 코드 예제가 반드시 필요한 것은 아니며 기본적인 아이디어만으로도 충분합니다.여러 중첩 된 리소스가있는 레일스 양식 객체

업데이트하는 것은

이 예를 생각해 보자. 두 가지 모델이 있습니다. 회사에 대한 하나의 중첩 된 사용자의 경우

class Company 
    has_many :users 

    accepts_nested_attributes_for :users 
end 

class User 
    belongs_to :company 
end 

나는 다음과 같은 작성합니다 양식 개체 패턴을 사용하여 :

<%= form_for @company_form do |f| %> 
    <%= f.text_field :name %> 
    <%= f.text_field :user_name %> 
    <%= f.submit %> 
<% end %>  

양식 개체

class CompanyForm 
    include Virtus 

    extend ActiveModel::Naming 
    include ActiveModel::Conversion 
    include ActiveModel::Validations 

    attr_accessor :company, :user 

    def user 
    @user ||= company.users.build 
    end 

    def company 
    @company ||= Company.new 
    end 

    def submit(params={}) 
    company.name = params[:name] 
    user.name = params[:user_name] 
    persist! 
    end 

    private 

    def persist! 
    company.save! 
    user.save! 
    end 
end 

그러나 나는 양식을 가지고있는 경우 여러 사용자가있는 회사를 만들 수 있습니다. 일반적인 접근 방식은 nested_form를 사용하여,이처럼 작성하는 것입니다 :

<%= nested_form_for @company do |f| %> 
    <%= f.text_field :name %> 
    <%= fields_for :users, do |user_form| %> 
    <%= user.form.text_field :name %> 
    <% end %> 
    <%= f.link_to_add "Add a user", :users %> 
    <%= f.submit %> 
<% end %> 

내가 어떻게이 경우 그 양식 개체 패턴을 구현합니까 물어 보는 거지? 당신이 CompanyForm이 방법을 추가하는 경우 #{association_name}_attributes=

때문에, : :

def users_attributes=(users_attributes) 
    # manipulate attributes as desired... 
    @company.users_attributes= users_attributes 
end 

def users 
    company.users 
end 

fields_for 발전기가 CompanyForm에 대한 중첩 된 사용자 필드를 생성이 형식의 방법

+0

이것은 실제로 질문이 아니므로 대답하기 어려울 것입니다. 몇 가지 코드를 게시하고보다 구체적인 질문을 해주십시오. 감사. – Powers

+0

업데이트를 게시했습니다. – tokenvolt

+0

이것은 좋은 질문입니다. 제가 더 많은 정보를 찾으려고합니다. 양식 객체로이 문제를 해결해 봤습니까? – jay

답변

11

레일 fields_for 도우미 checks 마치 회사 인 것처럼. 메소드에서 아무 것도 일어나지 않기 때문에 위의 내용은 위임으로 다시 작성 될 수 있습니다.

delegate :users, :users_attributes=, :to => :company, :prefix => false, :allow_nil => false 
관련 문제