2011-11-06 83 views
1

我想了解巢怎么机型轨(活动记录,然后将其应用到我的MongoDB的项目)Rails 3个中嵌套模型

我下面这个教程railscast:

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

但当我无法显示表单以向调查添加新问题时,我被卡在开始处。

我在模型建立的关系

型号/ survey.erb:

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

型号/ question.erb:

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

控制器/ 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 

组的意见/调查/ _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 %> 

,但是当我尝试建立嵌套形式,这是行不通的。我没有得到任何错误,但表单不显示。

我错过了什么?

回答

1

您应该在field_for行上使用<%=而不是<%,与您的form_for行类似。否则,实际的嵌套表单将不会显示。

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

谢谢为了那个原因。我对我最近阅读的东西感到困惑。如果不输出代码,控制逻辑在rails中不需要<%=。所以我认为field_for是一个控制thingy输出内部代码:( –

1

你不采取在你的例子充分利用嵌套形式。

变干的事情了,你应该更换form_for(@survey)通过nested_form_for(@survey)

,然后你可以拉出的问题分形式到它自己的部分,而只是做一个:

f.fields_for :questions # without a block 

和处理作为常规的./app/views/questions/_form.html.erb下的问题形式form_for(@question)

这样,您不必在调查表单中为问题表单复制代码。

P.S .:您需要将“nested_form”Gem添加到您的Gemfile中。

+0

天才,大脑会爆炸:) –

+0

但这是一个宝石或是轨道的一部分? –

+0

这是一个宝石,叫做“nested_from” - 你需要将它添加到你的Gemfile – Tilo

0

万一别人拿到的卡就这个问题和大风在这里,像我这样的,这个问题是缺少“=”在fields_for调用的括号:“<%= f.fields_for ......”

+0

是的,我看到它已经回答了,不要问...... – tttthet