我有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
Run Code Online (Sandbox Code Playgroud)
当我Customer向用户呈现一个新表单时,我想确保有一个空白billing_address,以便用户实际看到该字段billing_address.所以我的控制器中有这样的东西:
def new
@customer = Customer.new
@customer.build_billing_address
end
Run Code Online (Sandbox Code Playgroud)
但是,如果用户没有填写任何billing_address字段,但尝试提交无效表单,则会向他们显示一个不再包含字段的表单billing_address,除非我在create控制器的操作中添加了这样的内容:
def create
@customer = Customer.new(params[:customer])
@customer.build_billing_address if @customer.billing_address.nil?
end
Run Code Online (Sandbox Code Playgroud)
还有另一个问题,即如果用户尝试编辑a Customer,但Customer没有关联billing_address,则他们将看不到该字段billing_address.所以我必须向控制器添加这样的东西:
def edit
@customer = Customer.find(params[:id])
@customer.build_billing_address if @customer.billing_address.nil?
end
Run Code Online (Sandbox Code Playgroud)
类似的东西需要在控制器的update方法中发生.
无论如何,这是高度重复的,所以我想在模型中做一些事情.我最初的想法是为模型的after_initialize事件添加一个回调,如下所示:
class CustomerModel
after_initialize :build_billing_address, if: 'billing_address.nil?'
end
Run Code Online (Sandbox Code Playgroud)
但我的蜘蛛般的感觉开始刺痛.谁能说我将来不会Customer在我的代码的其他部分实例化,并以某种意想不到的方式造成严重破坏.
所以我目前的想法是,最好的地方是在表单视图本身,因为我想要完成的是billing_address为表单留空,表单本身是我所知道的代码中唯一的位置确定我即将展示一张表格billing_address.
但是,你知道,我只是互联网上的一些人.我应该在哪儿build_billing_address?
尽管Xavier Shay 的建议来自 2011 年,但他建议将其放入视图中, “因为这是一个视图问题(我们是否显示字段?)”:
应用程序/helpers/form_helper.rb:
module FormHelper
def setup_user(user)
user.address ||= Address.new
user
end
end
Run Code Online (Sandbox Code Playgroud)
应用程序/视图/用户/_form.html.erb:
<%= form_for setup_user(@user) do |f| %>
Run Code Online (Sandbox Code Playgroud)
请注意,我必须将辅助方法更改为以下内容:
def setup_user(user)
user.addresses.build if user.addresses.empty?
user
end
Run Code Online (Sandbox Code Playgroud)
控制器保持完全不变。
| 归档时间: |
|
| 查看次数: |
1523 次 |
| 最近记录: |