【问题标题】:Rails 3.2 Create Parent Model from Child ViewRails 3.2 从子视图创建父模型
【发布时间】:2012-01-20 00:01:44
【问题描述】:

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

#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

【问题讨论】:

    标签: ruby-on-rails forms nested-forms belongs-to fields-for


    【解决方案1】:

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

    你有这个:

    = fields_for :course do |builder|
    

    你应该有这个:

    = f.fields_for :course do |builder|
    

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

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

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

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

    【讨论】:

    • 当我在更改前检查时,我没有看到 course_attributes,当我将其设为 f.fields_for 时,表格根本不显示。所以项目的form_for一定有问题?
    • 我发现了一个潜在的解决方案,说明它为什么没有出现,请查看更新 2,但这是处理此问题的最佳方法吗?
    • 啊,是的,你需要事先做@course.build_project
    【解决方案2】:

    我使用了 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) %>
    

    【讨论】:

    • 我不想为此使用额外的宝石,我想看看其他人怎么说。我也更新了我的问题。
    猜你喜欢
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 2013-05-11
    相关资源
    最近更新 更多