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
4

2 回答 2

3

您应该使用表单构建器来构建您的对象,而不是仅仅fields_for使用它自己。

你有这个:

= fields_for :course do |builder|

你应该有这个:

= f.fields_for :course do |builder|

course_attributes=不同之处在于,通过在初始表单构建器上调用它,Rails 将检查初始调用中的对象上是否存在方法form_for(在本例中为@project),如果存在则定义此表单内的字段为course_attributes.

继续检查此更改前后的表格,只是为了看看。我会等。

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

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

于 2012-01-23T03:36:55.957 回答
0

我使用了 gem 'dynamic_form'。Faculty_list(id, Faculty_name) 表包含学院的名称。

<%= f.select :faculty, options_from_collection_for_select(@faculty_list, 'id', 'faculty_name', @faculty.faculty.to_i) %>
于 2012-01-20T00:12:51.570 回答