2010-11-28 7 views
0

Lorsque j'utilise form_for :model, les données sont enregistrées lorsque je soumets le formulaire.Rails: comment enregistrer les données de formulaire après l'enregistrement

Cependant lorsque j'utilise form_tag, les données sont perdues après le traitement du formulaire. Je dois utiliser form_tag parce que j'ai deux modèles dans une forme.

Existe-t-il un moyen d'enregistrer des données de formulaire avec form_tag?

Répondre

4

Vous faites deux hypothèses incorrectes dans votre question. Tout d'abord, form_tag n'est pas nécessaire ou même recommandé pour les formulaires à plusieurs modèles; Deuxièmement, form_tag ne fait rien de fondamentalement différent de form_for, il est fort probable que vous ne formatez pas les noms de champs correctement pour votre contrôleur.

Afin de créer un formulaire avec des modèles imbriqués, vous devez utiliser l'assistant fields_for en conjonction avec form_for. La relation doit d'abord être définie dans le modèle avec accepts_nested_attributes_for. Puisque vous ne nous avez pas donné d'informations sur vos modèles, je vais vous donner un exemple maquillé:

class Person < ActiveRecord::Base 
    has_one :address 
    accepts_nested_attributes_for :address 
end 

class Address < ActiveRecord::Base 
    belongs_to :person 
end 

Cela indique ActiveRecord que le modèle de personne peut accepter des attributs pour adresse, et transmettre les attributs à la modèle correct à créer.

<% form_for :person do |p| %> 
    <% p.fields_for :address do |a| %> 
    use the a form builder to create 
    fields for the address model here 
    <% end %> 
<% end %> 

enchaînant l'aide fields_for du générateur de formulaire permet p les aides génèrent des attributs dans le format correct.

Plus d'informations: Nested Model Forms

+0

Merci pour cette réponse détaillée. J'ai beaucoup appris et j'ai tout réparé. – Alex

3

À peu près de la même manière qu'avant, sauf que vous aurez besoin de construire les paramètres. Vous pouvez regarder votre journal pour voir comment les paramètres sont envoyés.

par ex.

def create 
    @silly_hat = SillyHat.new(:name => params[:name], :size => params[:size], :colour => params[:colour]) 
    if @silly_hat.save 
    ... 
+0

Alors, comment devrait ressembler à ma forme? J'utilise password_field_tag: mot de passe et cela ne fonctionne pas. – Alex

Questions connexes