【发布时间】:2018-01-04 01:57:08
【问题描述】:
我有一个表单可以将 Parent 和许多 Child 对象保存在一起。在Child对象的初始化过程中,它需要访问Grandparent。模型如下所示:
class Grandparent
has_many :parents, inverse_of: :grandparent
end
class Parent
belongs_to :grandparent, inverse_of: :parents
has_many :children, inverse_of: :parent
accepts_nested_attributes_for :children
end
class Child
belongs_to :parent
delegate :grandparent, to: :parent
# Test code
after_initialize do
raise 'NoParentError' unless parent.present?
raise 'NoGrandparentError' unless grandparent.present? # Errors here!
puts 'All good!'
end
end
请记住,该表单用于同时保存新的父对象和多个子对象,但我正在尝试访问祖父对象中的信息。我读到inverse_of 选项应该可以解决问题,但不幸的是child.grandparent 仍然是nil。
这是实际导致故障的控制器部分:
@parent = @grandparent.parents.build(parent_params)
# prior to saving @parent
由于某种原因,父母不知道祖父母是谁。
更新
看来我可以用这段代码克服这个错误:
@parent = Parent.new(parent_params.merge(grandparent: @grandparent))
但这对我来说似乎不是很“随意”。
更新 2
根据要求,这是我的表单控制器。
class ParentsController < ApplicationController
before_action :set_grandparent
def new
@parent = @grandparent.parents.new
@parent.children.build
end
def create
@parent = @grandparent.parents.build(parent_params)
if @parent.save
redirect_to @grandparent
else
render :new
end
end
private
def set_grandparent
@grandparent = Grandparent.find(params[:grandparent_id])
end
def parent_params
params.require(:parent).permit(:parent_attribute,
children_attributes: [:some_attribute, :other_attribute, :id, :_destroy]
end
end
这是我的视图:
= simple_form_for [@grandparent, @parent] do |f|
= f.input :parent_attribute
= f.simple_fields_for :children do |child_form|
= child_form.input :some_attribute
= child_form.input :other_attribute
= f.submit
我可以在Child 的after_initialize 代码中放置一个byebug,我可以看到未保存的Parent 和Child,并且可以通过以下方式访问它们:
p = self.parent
=> Parent object
p.grandparent
=> nil
self.grandparent
=> nil
【问题讨论】:
-
什么是
Event? -
为什么在初始化
Child时实际上需要祖父母?你在哪里使用它? -
对不起,
Event是我的实际模型。我试图通过更改所有名称来简化情况。 -
@JagdeepSingh 好问题。基本上祖父母有一个
has_many关联。孩子需要遍历这些记录并创建一些其他记录。如果您需要更多详细信息,我可以稍后更新我的问题。 -
也许
parent.grandparent.present?可以在没有授权的情况下工作?
标签: ruby-on-rails associations nested-forms