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,但这是处理此问题的最佳方法吗?啊,更正是的,您需要执行@课程。在开始之前构建项目。