Ruby on rails Rails 3.2从子视图创建父模型

Ruby on rails Rails 3.2从子视图创建父模型,ruby-on-rails,forms,nested-forms,belongs-to,fields-for,Ruby On Rails,Forms,Nested Forms,Belongs To,Fields For,我很难理解怎么做。我有两个模型,一个项目和一门课程 #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页面(子对象)上,我想输入新课程的名称,并让它创建父对象

我很难理解怎么做。我有两个模型,一个项目和一门课程

#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
页面(子对象)上,我想输入新
课程的名称
,并让它创建父对象

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

= 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 我已将我的字段\u修改为(根据Ryan的要求):

我使用的是haml,因此应该显示
=
,但的字段甚至不会显示在页面上或生成的html中。有什么线索可以解释为什么会这样吗?(提交按钮不显示)

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

# 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
我用了gem的“动态形式”。 教员列表(id,教员名称)表包含教员的名称

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

您应该使用表单生成器来构建对象,而不仅仅是
字段本身

你有这个:

= fields_for :course do |builder|
= f.fields_for :course do |builder|
您应该在哪里拥有此功能:

= fields_for :course do |builder|
= f.fields_for :course do |builder|
不同之处在于,通过在初始表单生成器上调用它,Rails将检查对象上是否有来自初始
表单的
属性=
方法(在这种情况下,即
@project
)如果有,它会将表单中的字段定义为
课程属性

继续检查此更改前后的表单,以便查看。我会等的

这是通过在模型中为
调用接受嵌套的属性实现的。这个方法定义了允许嵌套属性工作的
course\u attributes=
方法。创建项目后,它还应该创建课程


此外,无需将
课程id
设置为可访问属性,因为您的表单不会设置该属性。

我不想为此使用额外的gem,我想看看其他人有什么意见。我还更新了我的问题。当我在更改前检查时,我没有看到课程属性,当我为
设置
f.fields\u时,表单根本不会显示。因此,项目的
表单一定有问题吗?我发现了一个潜在的解决方案,可以解释为什么它没有出现,请查看更新2,但这是处理此问题的最佳方法吗?啊,更正是的,您需要执行
@课程。在开始之前构建项目