2013-07-31 1 views
22

7 Patterns to Refactor Fat ActiveRecord Models - ecco un ottimo articolo sui diversi approcci di refactoring che utilizzano PORO. Sotto la 3a didascalia c'è un modello di Oggetto modulo, che mi è piaciuto molto e già implementato in uno dei progetti. Esiste solo un esempio che utilizza una risorsa nidificata, ma vorrei implementare questo modello per più risorse nidificate. Forse qualcuno qui aveva già affrontato questo? Non ho necessariamente bisogno di esempi di codice, solo l'idea di base andrebbe bene.Rails Form Objects con più risorse nidificate

Aggiornamento

Considerate questo esempio. Ho due modelli.

class Company 
    has_many :users 

    accepts_nested_attributes_for :users 
end 

class User 
    belongs_to :company 
end 

In caso di un utente nidificato per la società che utilizza modello Form Object avrei scritto quanto segue:

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

oggetto form

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 

Ma cosa succede se ho un modulo, in cui è possibile creare un'azienda con più utenti. L'approccio comune è quello di scrivere in questo modo, utilizzando 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 %> 

Quello che mi chiedo è come faccio a implementare che del modello Form oggetto in questo caso?

+0

Questa non è davvero una domanda, quindi sarà difficile rispondere. Puoi per favore postare del codice e fare una domanda più specifica? Grazie. – Powers

+0

Ho pubblicato un aggiornamento. – tokenvolt

+0

Questa è una bella domanda, che sto cercando di trovare maggiori informazioni su. Hai mai risolto questo problema con gli oggetti modulo? – jay

risposta

11

i binari fields_for helper checks per un metodo in questo formato: #{association_name}_attributes=

modo, se si aggiunge questo metodo per CompanyForm:

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

def users 
    company.users 
end 

i fields_for generatori genereranno i campi degli utenti nidificati per un CompanyForm come se fosse un'azienda. quanto sopra potrebbe essere riscritto come una delegazione poiché non sta accadendo nulla nei metodi:

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