我正在构建项目管理应用程序,我正在使用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
中创建多个学生?或者我如何设置这两个模型以相互协作。我希望你能够了解我的观点并知道我想要达到的目标。
答案 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
并且您不想要它,请告诉我,我可以使用类似的,更痛苦的解决方案来更新我的答案。