2011-11-06 3 views
1

Je suis en train de comprendre comment les modèles nid avec des rails (dossiers actifs à appliquer ensuite à mon projet avec MongoDB)Rails 3 modèles imbriqués

que je suis ce tutoriel Railscast:

http://railscasts.com/episodes/196-nested-model-form-part-1

mais je suis bloqué au début quand je ne peux pas afficher le formulaire pour ajouter de nouvelles questions à l'enquête.

J'ai mis en place les relations dans les modèles

modèles/survey.erb:

class Survey < ActiveRecord::Base 
    has_many :questions, :dependent => :destroy 
    accepts_nested_attributes_for :questions 
    validates_presence_of :name 
end 

modèles/question.erb:

class Question < ActiveRecord::Base 
    belongs_to :survey 
    validates_presence_of :content 
end 

contrôleurs/surveys_controller.rb:

def new 
    @survey = Survey.new 
    @survey.questions.build 

    respond_to do |format| 
    format.html # new.html.erb 
    format.json { render json: @survey } 
    end 
end 

vues/enquête/_form.html.erb »

<%= form_for(@survey) do |f| %> 
    <% if @survey.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@survey.errors.count, "error") %> prohibited this survey from being saved:</h2> 

     <ul> 
     <% @survey.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <div class="field"> 
    <%= f.label :name %><br /> 
    <%= f.text_field :name %> 
    </div> 
    <h3>Add new question</h3> 
    <% f.fields_for :questions do |p| %> 
    <%= p.label :content, "Questions" %><br /> 
    <%= p.text_area :content, :rows => 3 %> 
    <% end %> 
    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

mais lorsque je tente de construire le emboîtées, il ne fonctionne pas. Je ne reçois aucune erreur mais le formulaire ne s'affiche pas.

Ai-je raté quelque chose?

Répondre

1

Vous devez utiliser un <%=, pas un <% sur votre ligne field_for, similaire à votre ligne form_for. Sinon, le formulaire imbriqué réel ne sera pas affiché.

<%= f.fields_for :questions do |p| %> 
+0

Merci pour ça. J'ai été confondu avec quelque chose que j'ai lu récemment. La logique de contrôle n'a pas besoin de <% = dans les rails si elle ne produit pas de code. Donc, je pensais que le field_for était un truc de contrôle pour sortir le code interne :( –

1

Vous n'utilisez pas pleinement les formulaires imbriqués dans votre exemple.

Pour sécher les choses que vous devez remplacer le form_for(@survey) par nested_form_for(@survey)

et vous pouvez retirer les sous-questions-forme dans son propre partiel, et faire juste un:

f.fields_for :questions # without a block 

et gérer la sous forme de questions sous ./app/views/questions/_form.html.erb en tant que régulier form_for(@question)

De cette façon, vous n'avez pas à dupliquer le code pour le formulaire de questions dans votre formulaire d'enquête.

P.S .: Vous devrez ajouter Gem "nested_form" à votre Gemfile.

+0

Genius, le cerveau va exploser :) –

+0

mais c'est une gemme ou fait partie des rails? –

+0

C'est un Gem, appelé "nested_from" - vous aurez besoin de l'ajouter à votre Gemfile – Tilo

0

Juste au cas où quelqu'un d'autre se est coincé sur ce sujet et les vents ici, comme moi, ce problème est le manque « = » dans les crochets de l'appel fields_for: « <% = f.fields_for ... »

+0

ouais, je vois qu'il a déjà répondu, ne demandez pas ... – tttthet