2013-12-11 64 views
1

我正在构建项目管理应用程序,我正在使用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 %> 

而对于jusst增加了一个简单的网上看到我的form_for结果create方法:

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

所以,当我填写在页面上的文本字段,并提交我得到的所有是{"name"=>"asd", "lecturer"=>"ffff", "students"=>{"name"=>"qeew"}},因为你只能看到我的最后一个学生被传递给这本字典。

如何在一个fields_for中创建多个学生?或者我如何设置这两个模型来相互配合。我希望你明白我的观点并知道我想达到什么目的。

回答

2

你可以建立你需要有场在您的控制器new行动的学生人数一样如下:

# app/controllers/projects_controller.rb 

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

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

# 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 %> 
+0

@rohit,感谢您的编辑。 – vee

+0

没问题。我通过手机编辑它,所以语法突出显示没有正确设置。我看到你再次编辑它:-) – Rohit

1

大概最容易做的事情是在一个适当的Project对象传递,而不是初始化它关闭的象征,:

然后按以下步骤更新您的视图的form_for声明。然后,将三名学生添加到对象中,并为整个集合创建一个字段。

要做到这一点,你会希望在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将自动为每个学生不同的字段您添加到控制器中的项目。


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

相关问题