Rails 3.2从子视图创建父模型

我很难理解如何做到这一点。 我有两个模型,一个项目和一个课程。

#project.rb belongs_to :course attr_accessible :course_id, :course accepts_nested_attributes_for :course, reject_if: lambda { |a| a[:course_id] == 0 } #course.rb has_many :projects 

Projects#new页面(子对象)上,我想输入新course的名称并让它创建父对象。

这是我在视图中的尝试,但它似乎没有正常工作。

 = form_for [@user, @project] do |f| # Other fields = fields_for :course do |builder| = builder.label :name, 'Course Name' = builder.text_field :name = f.submit 

我稍后将使用这个父对象来创建更多项目,但是现在,让我们假设它不存在。

更新1我已经修改了我的fields_for(根据Ryan的要求):

 = form_for [@user, @project] do |f| # Other fields = f.fields_for :course do |builder| = builder.label :name, 'Course Name' = builder.text_field :name = f.submit 

我正在使用haml,所以=应该显示,但是字段甚至没有显示在页面上,或者生成的html中。 任何线索,为什么会这样? (提交按钮确实显示)

更新2我找到了一个潜在的解决方案,但我不确定这是否是正确的解决方法。 在控制器中,我需要为fields_for构建一个课程来显示。

 # ProjectsController def new @project = @user.projects.new @project.build_course end # project.rb attr_accessible :course_attributes # So yes, I now see what you were talking about, regarding the course_attributes 

您应该使用表单构建器来构建对象,而不仅仅是fields_for

你有这个:

 = fields_for :course do |builder| 

你应该在哪里:

 = f.fields_for :course do |builder| 

不同之处在于,通过在初始表单构建器上调用它,Rails将检查是否在初始form_for调用的对象上有一个course_attributes=方法(在这种情况下,那是@project ),如果有的话它会将此表单中的字段定义为course_attributes

在此更改之前和之后检查表单,以便查看。 我会等。

这可以通过模型中的accepts_nested_attributes_for调用实现。 这个方法定义了course_attributes=方法,允许嵌套属性工作。 创建项目后,它还应该创建课程。

此外,不需要将course_id可访问属性,因为您的表单不会设置它。

我用了’dynamic_form’。 faculty_list(id,faculty_name)表包含各个院系的名称。

 <%= f.select :faculty, options_from_collection_for_select(@faculty_list, 'id', 'faculty_name', @faculty.faculty.to_i) %>