私は自分の関係に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 を介して Person と Addrs を公開しています。次の 2 つのオプションが考えられます。
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