2013-06-26 11 views
7

Ho 3 modelli: preventivo, cliente e articolo. Ogni quota ha un cliente e un articolo. Vorrei creare una nuova citazione, un nuovo cliente e un nuovo articolo nelle rispettive tabelle quando premo il pulsante di invio. Ho esaminato altre domande e invii di rails e non funzionano per la mia situazione o non so come implementarli.Ruby on Rails: crea record per più modelli con un modulo e uno invia

quote.rb

class Quote < ActiveRecord::Base 
    attr_accessible :quote_number 
    has_one :customer 
    has_one :item 
end 

customer.rb

class Customer < ActiveRecord::Base 
    attr_accessible :firstname, :lastname 
    #unsure of what to put here 
    #a customer can have multiple quotes, so would i use has_many or belongs_to? 
    belongs_to :quote 
end 

item.rb

class Item < ActiveRecord::Base 
    attr_accessible :name, :description 
    #also unsure about this 
    #each item can also be in multiple quotes 
    belongs_to :quote 

quotes_controller.rb

class QuotesController < ApplicationController 
    def index 
    @quote = Quote.new 
    @customer = Customer.new 
    @item = item.new 
    end 

    def create 
    @quote = Quote.new(params[:quote]) 
    @quote.save 
    @customer = Customer.new(params[:customer]) 
    @customer.save 
    @item = Item.new(params[:item]) 
    @item.save 
    end 
end 

items_controller.rb

class ItemsController < ApplicationController 
    def index 
    end 

    def new 
    @item = Item.new 
    end 

    def create 
    @item = Item.new(params[:item]) 
    @item.save 
    end 
end 

customers_controller.rb

class CustomersController < ApplicationController 
    def index 
    end 

    def new 
    @customer = Customer.new 
    end 

    def create 
    @customer = Customer.new(params[:customer]) 
    @customer.save 
    end 
end 

mia forma di preventivi/new.html.erb

<%= form_for @quote do |f| %> 
    <%= f.fields_for @customer do |builder| %> 
    <%= label_tag :firstname %> 
    <%= builder.text_field :firstname %> 
    <%= label_tag :lastname %> 
    <%= builder.text_field :lastname %> 
    <% end %> 
    <%= f.fields_for @item do |builder| %> 
    <%= label_tag :name %> 
    <%= builder.text_field :name %> 
    <%= label_tag :description %> 
    <%= builder.text_field :description %> 
    <% end %> 
    <%= label_tag :quote_number %> 
    <%= f.text_field :quote_number %> 
    <%= f.submit %> 
<% end %> 

Quando provo sostenendo che ottengo un errore:

Can't mass-assign protected attributes: item, customer 

Quindi, per cercare di risolvere il problema ho aggiornato l'attr_accessible in quote.rb per includere: voce,: cliente, ma poi ho ottenere questo errore:

Item(#) expected, got ActiveSupport::HashWithIndifferentAccess(#) 

Qualsiasi aiuto sarebbe molto apprezzato.

+0

Provare a fare: nome e: descrizione accessibile e: nome e cognome inseriti nei rispettivi modelli. – lilwupster

+0

@lilwupster L'ho fatto ma ho ancora gli stessi errori. – notblakeshelton

risposta

4

Per inviare un modulo ed è bambini associati è necessario utilizzare accepts_nested_attributes_for

Per fare questo, è necessario dichiarare che il modello per il controller che si intende utilizzare (nel tuo caso, sembra che il citazione controller.

class Quote < ActiveRecord::Base 
    attr_accessible :quote_number 
    has_one :customer 
    has_one :item 
    accepts_nested_attributes_for :customers, :items 
end 

Inoltre, è necessario assicurarsi di dichiarare che attributes are accessible in modo da evitare altri errori di assegnazione di massa.

+0

welp, ho inserito accept_nested_attributes_for: customers,: items e anche provato: customer,: item ma nessuno dei due sembrava funzionare. – notblakeshelton

+0

Hai controllato che gli attributi siano accessibili (link sopra)? – creativereason

+0

sì, l'ho provato; non ha funzionato, quindi sono andato con attr_protected: id su tutti loro per assicurarmi di non aver perso nessuno, ma ora sputa l'errore "ActiveRecord :: AssociationTypeMismatch in QuotesController # create
Item (#) previsto, ottenuto ActiveSupport :: HashWithIndifferentAccess (#)" – notblakeshelton

1

Se si desidera aggiungere informazioni per i modelli diferent vi suggerisco di applicare nested_model_form Li fare riferimento a questo riferimento: http://railscasts.com/episodes/196-nested-model-form-part-1?view=asciicast.

Questa soluzione è molto semplice e pulita.

+0

Devo cambiare i miei file modello? Quel screencast usa una relazione has_many, belongs_to, mentre sto usando un has_one e has_many, ma non ho idea se sia giusto. Ho provato a cambiare il mio '@' nelle mie variabili in index.html.erb a ':' ma non ha funzionato. – notblakeshelton

Problemi correlati