2013-07-31 44 views
22

7 Patterns to Refactor Fat ActiveRecord Models - 這裏是一篇關於使用PORO的不同重構方法的精彩文章。在第三個標題下有一個Form Object模式,我真的很喜歡它,並且已經在其中一個項目中實現了。只有一個使用嵌套資源的示例,但我想爲多個嵌套資源實現此模式。也許這裏有人已經處理了這個?我不一定需要任何代碼示例,只是基本的想法會很好。帶有多個嵌套資源的Rails窗體對象

更新

考慮這個例子。我有兩個模型。

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 %> 

我所問的是如何實現在這種情況下,形式對象模式?

+0

這不是一個真正的問題,所以它很難回答。你可以請張貼一些代碼並問一個更具體的問題嗎?謝謝。 – Powers

+0

我發佈了一個更新。 – tokenvolt

+0

這是一個很好的問題,我試圖找到更多信息。你有沒有用表單對象解決這個問題? – jay

回答

11

軌道fields_for幫手checks對該格式的方法:#{association_name}_attributes=

所以,如果添加此方法CompanyForm:

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

def users 
    company.users 
end 

fields_for發電機將產生一個CompanyForm嵌套用戶域就好像它是一家公司一樣。以上可以重寫爲代表團,因爲方法中沒有任何事情發生:

delegate :users, :users_attributes=, :to => :company, :prefix => false, :allow_nil => false