Comment puis-je utiliser un seul formulaire dans une vue pour plusieurs modèles de Rails 3?
-
29-10-2019 - |
Question
J'ai un formulaire unique.
Que forme, est actuellement à la Vue du modèle de Message.
Parfois, je veux être en mesure d'associer un Contact (nom, prénom) avec ce Message.Le Contact est son propre Modèle.
Lorsque le formulaire est soumis, le Message a un contact_id attribut.Je voudrais que contact_id être associés, mais aussi de créer un nouveau Contact.
Comment dois-je faire dans Rails 3?
La solution
Il semble que vous souhaitez à la fois le Contact et Message d'objets créés à partir de la même forme et les faire associés.Comme je vous l'ai dit dans une précédente question.form_for peut prendre à la fois autonome valeurs et même d'autres objets de valeurs.
_form.html.erb
<% form_for :message do |f| %>
<%= f.test_field :some_field %>
..
..
<%= text_field :contact, :first_name %>
<%= text_field :contact, :last_name %>
<%= f.submit %>
<% end %>
messages_controller.rb
def new
@message = Message.new
@contact = Contact.new
end
def create
@message = Message.new(params[:message])
@contact = Contact.new(params[:contact])
@contact.message = @message
if @contact.save # saves both contact and message if has_one relation is given in models
..
else
...
end
end
Mais ceci étant dit, il est préférable d'utiliser Imbriqué modèle.Pour cela, vous devez écrire du code centré sur contact
.
contacts_controller.rb
def new
@contact = Contact.new
@contact.message.build
end
def create
@contact = Contact.new(params[:contact])
if @contact.save
..
else
..
end
end
_form.html
<% form_for :contact do |f| %>
<% f.fields_for :message do |p| %>
<%= p.text_field :some_field %>
...
<% end %>
<%= f.text_field :first_name %>
<%= f.text_field :second_name %>
<%= f.submit %>
<% end %>
Pour cela, vous aurez à spécifier accepts_nested_attributes_for :message
en Contact.rb
Autres conseils
Avec un formulaire modèle imbriqué.
Jetez un œil à: http://asciicasts.com/episodes/196-nested-model-form-part-1
Il est basé sur Rails 2, mais il n'y a pas grand chose à faire pour rendre le code compatible avec Rails 3.