从控制器到相关模型

时间:2013-12-12 05:30:13

标签: ruby-on-rails ruby-on-rails-3 model-associations fields-for

当我保存项目时,我无法与一个POST保存学生。

My Projects控制器如下所示:

class ProjectsController < ApplicationController

  def index
    @projects = Project.all
  end

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

  def create
    @project = Project.new(project_params)
    @project.status = "Waiting"
    # I'm not sure about these lines
    @project.students.each do |student|
      student = Student.new(params[:name])
    end
    @project.save!
    redirect_to projects_path
  end

  private
    def project_params
      params.require(:project).permit(:name, :lecturer)
    end

end

new_project视图如下:

<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 %>
        <% end %>
    </p>

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

我的问题是如何使用一个表单保存项目和学生(分配给它)?

1 个答案:

答案 0 :(得分:1)

首先,您的project_params方法不允许提交学生姓名。尝试这样的事情:

def project_params
  params.require(:project).permit(:name, :lecturer, students_attributes: [ :name ] )
end

接下来,在您的Project模型中,您需要一行

accepts_nested_attributes_for :students

(你可能已经把它放在那里 - 但如果你没有,你需要。)

既然已经完成了,你不应该在Project#create方法中使用这些行:

@project.students.each do |student|
  student = Student.new(params[:name])
end

因为您的项目现在可以接受学生的嵌套属性,所以当您save时,应该使用项目自动创建它们。