Ruby on Rails: créer des enregistrements de plusieurs modèles, avec un formulaire et soumettre un
J'ai un 3 modèles: devis, le client et le point. Chaque citation a un client et un seul élément. Je voudrais créer un nouveau devis, un nouveau client, et d'un nouvel élément dans leurs tables respectives lorsque j'appuie sur le bouton soumettre. J'ai regardé d'autres questions et railscasts et soit ils ne fonctionnent pas pour ma situation ou je ne sais pas comment les mettre en œuvre.
devis.rb
class Quote < ActiveRecord::Base
attr_accessible :quote_number
has_one :customer
has_one :item
end
client.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
élément.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
mon formulaire de devis/nouveau.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 %>
Quand j'ai essayer la soumission que j'obtiens une erreur:
Can't mass-assign protected attributes: item, customer
Donc, pour essayer et de le corriger j'ai mis à jour le attr_accessible dans le devis.rb inclure :élément :le client, mais ensuite, j'obtiens cette erreur:
Item(#) expected, got ActiveSupport::HashWithIndifferentAccess(#)
Toute aide serait grandement appréciée.
Je l'ai fait mais j'ai toujours les mêmes erreurs.
OriginalL'auteur notblakeshelton | 2013-06-26
Vous devez vous connecter pour publier un commentaire.
Soumettre un formulaire et il a associé des enfants, vous devez utiliser accepts_nested_attributes_for
Pour ce faire, vous devez les déclarer à la modèle pour le contrôleur, vous allez utiliser (dans votre cas, il semble que la Citation de Contrôleur.
Aussi, vous devez assurez-vous de déclarer qui les attributs sont accessibles afin de vous éviter d'autres de masse erreurs.
Avez-vous vérifiez que les attributs sont accessibles (lien ci-dessus)?
yep j'ai essayé; il n'a pas de travail, je suis donc allé avec attr_protected :id sur eux pour m'assurer que je n'ai pas manqué de tout, mais maintenant il crache de l'erreur "ActiveRecord::AssociationTypeMismatch dans QuotesController#créer <br /> Item(#) attendu, a obtenu ActiveSupport::HashWithIndifferentAccess(#)"
Avez-vous corriger l'erreur dans votre contrôleur qui a ceci:
@item = item.new
qui devrait être@item = Item.new
je pense que c'est la cause, parce que l'élément est de type incorrect.il était déjà capitalisés; c'était une erreur de ma part. merci pour l'aide mais je pense que je vais sur ce mal. je vais avoir un client has_many :devis et un devis belongs_to un client
OriginalL'auteur creativereason
Si vous souhaitez ajouter des infos pour les différents modèles, je suggère d'appliquer nested_model_form comme cette référence: http://railscasts.com/episodes/196-nested-model-form-part-1?view=asciicast.
Cette solution est très simple et la plus propre.
OriginalL'auteur kikicarbonell