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) %>