2013-07-31 52 views
22

7 Patterns to Refactor Fat ActiveRecord Models - đây là một bài viết tuyệt vời về các phương pháp tái cấu trúc khác nhau bằng PORO. Theo chú thích thứ ba có một mẫu đối tượng Form, mà tôi thực sự thích và đã được thực hiện trong một trong các dự án. Chỉ có một ví dụ sử dụng một tài nguyên lồng nhau, nhưng tôi muốn thực hiện mẫu này cho nhiều tài nguyên lồng nhau. Có lẽ ai đó ở đây đã xử lý chuyện này chưa? Tôi không nhất thiết cần bất kỳ ví dụ mã nào, chỉ là ý tưởng cơ bản sẽ ổn thôi.Rails Form Objects với nhiều tài nguyên lồng nhau

Cập nhật

Hãy xem xét ví dụ này. Tôi có hai mô hình.

class Company 
    has_many :users 

    accepts_nested_attributes_for :users 
end 

class User 
    belongs_to :company 
end 

Trong trường hợp của một người sử dụng lồng nhau cho công ty sử dụng mẫu Form Object tôi sẽ viết như sau:

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

Đối tượng biểu mẫu

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 

Nhưng nếu tôi có một hình thức, nơi một công ty có nhiều người dùng có thể được tạo. Cách tiếp cận thông thường là để viết nó như thế này, sử dụng 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 %> 

Những gì tôi đang hỏi là làm thế nào để thực hiện điều đó mẫu Form Object trong trường hợp này?

+0

Đây không thực sự là một câu hỏi, do đó sẽ khó trả lời. Bạn có thể xin vui lòng gửi một số mã và hỏi một câu hỏi cụ thể hơn? Cảm ơn. – Powers

+0

Tôi đã đăng một bản cập nhật. – tokenvolt

+0

Đây là một câu hỏi hay, tôi đang cố tìm thêm thông tin. Bạn đã bao giờ giải quyết vấn đề này với các đối tượng biểu mẫu chưa? – jay

Trả lời

11

đường ray fields_for helper checks cho một phương pháp trong định dạng này: #{association_name}_attributes=

như vậy, nếu bạn thêm phương pháp này để CompanyForm:

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

def users 
    company.users 
end 

các fields_for máy phát điện sẽ tạo ra các lĩnh vực sử dụng lồng nhau cho một CompanyForm như thể đó là một công ty. ở trên có thể được viết lại như một đoàn đại biểu vì không có gì xảy ra trong các phương pháp:

delegate :users, :users_attributes=, :to => :company, :prefix => false, :allow_nil => false 
Các vấn đề liên quan