3

我正在关注 Railscast 196,其中 R Bates 制作了嵌套形式。他有一个调查模型,该模型与一个问题模型有一个 has_many 关联。调查还接受_nested_attributes_for :questions。在surveys_controller 的新操作中,他执行以下操作以在调查表单中创建三个问题字段

  def new
    @survey = Survey.new
    3.times { @survey.questions.build }
  end

在 form_for @survey 中,他有以下内容可以在表单中创建问题字段

<% f.fields_for :questions do |builder| %>

  <p>
    <%= builder.label :content, "Question" %><br />
    <%= builder.text_area :content, :rows =>  3 %>

  </p>

在视频中,一旦他点击新调查,就会显示三个问题字段(以及表单的其他元素)。表格中与问题相关的元素没有出现在我面前。我认为他在 Rails 3 发布之前制作了这一集,所以可能发生了一些变化,但是,我不知道是什么,除了我没有看到做 3.times 的结果(@survey.questions.build)

模型

class Survey < ActiveRecord::Base
  attr_accessible :name

  has_many :questions, :dependent => :destroy
  accepts_nested_attributes_for :questions
end

形式

<%= form_for @survey do |f| %>
  <%= f.error_messages %>
  <p>
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </p>

  <% f.fields_for :questions do |builder| %>

  <p>
    <%= builder.label :content, "Question" %><br />
    <%= builder.text_area :content, :rows =>  3 %>

  </p>
  <% end %>
  <p><%= f.submit %></p>
<% end %>

html表单

<form accept-charset="UTF-8" action="/surveys" class="new_survey" id="new_survey" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;"><input name="authenticity_token" type="hidden" value="AWvA3/JpixF0C3sO8OzA5mMGsJzknvu99eovYv7M78E="></div>

  <p>
    <label for="survey_name">Name</label><br />
    <input id="survey_name" name="survey[name]" size="30" type="text">
  </p>

  <p><input name="commit" type="submit" value="Create Survey"></p>
</form>

更新

在表格内,我添加了这个

 <%= @survey.questions %>

它显示了这个

[#<Question id: nil, survey_id: nil, content: nil, created_at: nil, updated_at: nil>, #<Question id: nil, survey_id: nil, content: nil, created_at: nil, updated_at: nil>, #<Question id: nil, survey_id: nil, content: nil, created_at: nil, updated_at: nil>]

所以调查控制器的新操作中的 3.times 显然是有效的,但由于某种原因,当我这样做时,这些字段没有显示

<% f.fields_for :questions do |builder| %>

      <p>
        <%= builder.label :content, "Question" %><br />
        <%= builder.text_area :content, :rows =>  3 %>

      </p>
4

1 回答 1

3

我应该在你第一次发帖时就看到了。无论如何,您=fields_for. 那应该是

<%= f.fields_for :questions do |builder| %>
于 2013-02-18T03:10:11.750 回答