问题
我有一个父母,accepts_nested_attributes_for
一个孩子。所以,当我有一个给父母的表格时,我需要给build
孩子,这样我也可以为它显示表格字段。我想知道的是:我应该build
把孩子放在哪里?在模型、视图或控制器中?
为什么我要问这个
你可能会摇头并认为我是一个疯子问这样的问题,但这是让我来到这里的思路。
我有一个模型Customer
,像这样:accepts_nested_attributes_for
billing_address
class Customer
belongs_to :billing_address, class_name: 'Address'
accepts_nested_attributes_for :billing_address
end
当我Customer
向用户展示新表单时,我想确保有一个空白billing_address
,以便用户实际看到billing_address
. 所以我的控制器中有这样的东西:
def new
@customer = Customer.new
@customer.build_billing_address
end
但是,如果用户没有填写任何billing_address
字段,而是尝试提交无效的表单,他们将看到一个不再具有 的字段的表单,除非我在控制器billing_address
的操作中放入类似的内容create
:
def create
@customer = Customer.new(params[:customer])
@customer.build_billing_address if @customer.billing_address.nil?
end
还有另一个问题,如果用户尝试编辑 a Customer
,但Customer
它还没有关联billing_address
,他们将看不到billing_address
. 所以我必须在控制器中添加这样的东西:
def edit
@customer = Customer.find(params[:id])
@customer.build_billing_address if @customer.billing_address.nil?
end
update
在控制器的方法中也需要发生类似的事情。
不管怎样,这是高度重复的,所以我想在模型中做一些事情。我最初的想法是为模型的after_initialize
事件添加一个回调,如下所示:
class CustomerModel
after_initialize :build_billing_address, if: 'billing_address.nil?'
end
但我的蜘蛛侠感觉开始刺痛。谁能说我以后不会Customer
在我的代码的其他部分实例化 a 并以一些意想不到的方式造成严重破坏。
所以我目前的想法是,最好的地方是表单视图本身,因为我想要完成的是为billing_address
表单留一个空白,而表单本身是我知道的代码中唯一的地方确定我要为billing_address
.
但是,你知道,我只是互联网上的某个人。我应该在哪里build_billing_address
?