【发布时间】:2012-07-14 23:59:18
【问题描述】:
我将nested_form gem 用于我的AddressBook 关系。当用户清除现有Addr 的值时,我想删除该Addr 而不是用空白value 保存
class Person < ActiveRecord::Base
has_many :addrs, dependent: :destroy
attr_accessible :name, :addrs_attributes
accepts_nested_attributes_for :addrs, reject_if: :addr_blank, allow_destroy: true
def addr_blank(a)
valid? && a[:id].blank? && a[:value].blank?
end
class Addr < ActiveRecord::Base
belongs_to :person
attr_accessible :kind, :label, :value, :person_id
我的:reject_if 方法效果很好,但它并没有给我所需的一切
-
valid?通过验证保留我的空白地址 -
a[:id].blank?在用户空白和现有记录时避免拒绝
现在,当用户将value 空白时,我需要删除(而不是保存)现有的Addr。另外,我通过 RESTful API 公开 Persons 和 Addrs。我看到了两种可能的选择:
- 后处理
params哈希以添加神奇的_destroy=1参数。 IOW,模拟按下删除按钮的用户活动。 - 将其封装在
Addr模型中,以便有效地将带有空白value的更新视为删除。
根据这里的建议,我是如何实现它的:
people_controller.rb
def update
@person = Person.find(params[:id])
@person.destroy_blank_addrs(params[:person])
respond_to do |format|
...
person.rb
def destroy_blank_addrs(person_params)
if valid? && person_params[:addrs_attributes]
person_params[:addrs_attributes].each do |addr_params_array|
addr_params= addr_params_array[1]
addr_params[:_destroy] = '1' if !addr_params[:id].blank? && addr_params[:value].blank?
end
end
end
【问题讨论】:
-
两者中,使用选项1。你不希望像“如果X字段的值为空则删除记录”这样的“魔术”。
-
我用您建议的解决方案更新了问题。
-
@Zabba,我在 18 个月后重构了这段代码,你是对的。我将值空白为“神奇”
destroy_blank_addrs的想法是脑残。我也相信任何涉及直接修改params数组的解决方案都是不好的做法。任何后处理都应在assign_attributes之后但在save之前完成
标签: ruby-on-rails nested-forms