一个fields_for中的多个文本字段

时间:2013-12-11 19:53:29

标签: ruby-on-rails associations form-for fields-for

我正在构建项目管理应用程序,我正在使用form_for创建项目,但在其中我希望fields for创建3名学生。

我为这样的项目设置了new.html.erb

<h1>Creating new project</h1>

<%= form_for :project, url: projects_path do |f| %>
  <p>
    <%= f.label :name %>
    <%= f.text_field :name %>
  </p>

  <p>
    <%= f.label :lecturer %>
    <%= f.text_field :lecturer %>
  </p>

    <p>
        <%= f.fields_for :students do |s| %>
            <%= s.label :name %>
            <%= s.text_field :name %><br>
            <%= s.label :name %>
            <%= s.text_field :name %><br>
            <%= s.label :name %>
            <%= s.text_field :name %>
        <% end %>
    </p>

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

对于create方法,jusst添加了一个简单的行来查看我的form_for结果:

  def create
    render text: params[:project].inspect
  end

因此,当我填写页面上的文本字段并点击提交时,我得到的是{"name"=>"asd", "lecturer"=>"ffff", "students"=>{"name"=>"qeew"}},因为您只能看到我的上一个学生被传递到此词典。

如何在一个fields_for中创建多个学生?或者我如何设置这两个模型以相互协作。我希望你能够了解我的观点并知道我想要达到的目标。

2 个答案:

答案 0 :(得分:3)

您可以在控制器new操作中构建您需要拥有字段的学生人数,如下所示:

# app/controllers/projects_controller.rb

def new
  @project = Project.new
  3.times do 
    student = @project.students.build
  end
end

这将在项目实例下建立三名学生。

然后更新您的视图的form_for声明,如下所示:

# app/views/projects/new.html.erb

<%= form_for @project, url: projects_path do |f| %> 
  <p>
    <%= f.label :name %>
    <%= f.text_field :name %>
  </p>
  <p>
    <%= f.label :lecturer %>
    <%= f.text_field :lecturer %>
  </p>
  <p>
    <%= f.fields_for :students do |s| %>
      <%= s.label :name %>
      <%= s.text_field :name %>
    <% end %>
  </p>
  <p>
    <%= f.submit %>
  </p>
<% end %>

答案 1 :(得分:1)

最简单的做法可能是传入一个合适的Project对象,而不是从符号初始化它。然后,向对象添加三个学生,并为整个集合创建一个字段。

要做到这一点,你需要在projects#new -

中使用这样的代码
@project = Project.new
3.times { @project << Student.new }

然后以表格形式结束:

form_for @project do |f|
  ...
  f.fields_for :students do |s|
    s.label :name
    s.text_field :name
  end
end

fields_for会自动为您添加到控制器中项目的每个学生生成单独的字段。


有一点我不太确定:我这需要你在accepts_nested_attibutes_for :students模型中添加一行Project,但我不太确定。这确实具有额外的优势,您可以在控制器的创建操作中轻松创建学生和项目,但在任何情况下都不是正确的选择。如果我的解决方案似乎确实需要accepted_nested_attributes_for并且您不想要它,请告诉我,我可以使用类似的,更痛苦的解决方案来更新我的答案。