我正在为我的关系使用nested_form
宝石。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?
当用户空白和现有记录时避免拒绝
现在,Addr
当用户将value
. 另外,我通过 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|
...
人.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