2009-08-20 6 views
0

Comment puis-je faire cela fonctionner dans Rails 2.3?Formulaire de modèle imbriqué avec collection dans Rails 2.3

class Magazine < ActiveRecord::Base 
    has_many :magazinepages 
end 

class Magazinepage < ActiveRecord::Base 
    belongs_to :magazine 
end 

puis dans le contrôleur:

def new 
    @magazine = Magazine.new 
    @magazinepages = @magazine.magazinepages.build 
end 

et la forme:

problème
<% form_for(@magazine) do |f| %> 
    <%= error_messages_for :magazine %> 
    <%= error_messages_for :magazinepages %> 
    <fieldset> 
    <legend><%= t('new_magazine') %></legend> 
     <p> 
     <%= f.label :title %> 
     <%= f.text_field :title %> 
     </p> 
     <fieldset> 
     <legend><%= t('new_magazine_pages') %> 
      <% f.fields_for :magazinepages do |p| %> 
      <p> 
       <%= p.label :name %> 
       <%= p.text_field :name %> 
      </p> 
      <p> 
       <%= p.file_field :filepath %> 
      </p> 
      <% end %> 
     </fieldset> 
    <p> 
     <%= f.submit :save %> 
    </p> 
    </fieldset> 
<% end %> 

est, si je veux présenter une collection de magazinepages, les plaintes activerecord parce qu'il est attendu un modèle et non un tableau.

créer une action:

def create 
    @magazine = Magazine.new params[:magazine] 
    @magazine.save ? redirect_to(@magazine) : render(:action => 'new') 
end 
+0

Pouvez-vous poster le message d'erreur complet avec la trace de la pile? – ryanb

+0

Il doit avoir été une syntaxe burp, ça fonctionne parfaitement –

Répondre

0

Dans le magazine:

accepts_nested_attributes_for: magazinepages

Magazine.new (params [: revue]) sera alors gérer la hiérarchie des objets pour vous automatiquement

0

Je ne suis pas 100% sûr de ce que vous demandez, mais si vous essayez d'instancier un nouveau magazine, avec beaucoup de magazinepages, vous aurez besoin de itérer chaque page de magazine. Quelque chose comme ceci:

def create 
    @magazine = Magazine.new(params[:magazine]) 
    if params[:magazinepages] 
    params[:magazinepages].each do |page| 
     @magazine.magazinepages.build(page) 
    end 
    end 

    # Save the model, do your redirection or rendering invalid model etc 
end 
+0

Je sais que cela peut être fait de cette façon, mais je voulais réduire le nombre de lignes, de sorte que je n'avais qu'une seule ligne dans l'action de création –

Questions connexes