Tôi đang sử dụng đá quý nested_form
cho mối quan hệ AddressBook
của mình. Khi những khoảng trống sử dụng ra giá trị của một hiện Addr
, tôi muốn xóa Addr
hơn là tiết kiệm với một trống value
cách tránh lưu bản ghi trống trên biểu mẫu đường ray lồng nhau
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
phương pháp :reject_if
tôi hoạt động tốt nhưng nó không cho tôi tất cả mọi thứ tôi cần
valid?
giữ Addrs trống của tôi xung quanh thông qua xác nhậna[:id].blank?
tránh bị từ chối khi những khoảng trống sử dụng ra và ghi lại hiện
Bây giờ, tôi cần phải xóa (thay vì lưu) một số hiện tại Addr
khi người dùng điền vào value
. Ngoài ra, tôi đang trưng bày Persons và Addrs thông qua API RESTful. Tôi thấy hai tùy chọn có thể có:
- &hl=vi băm để thêm phép thuật
_destroy=1
param. IOW, mô phỏng hoạt động của người dùng bằng cách nhấn nút xóa. - Đóng gói phần này bên trong mô hình
Addr
sao cho bản cập nhật có số trốngvalue
được coi là xóa hiệu quả.
Dựa trên những lời khuyên ở đây là làm thế nào tôi thực hiện nó:
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
Trong hai, sử dụng tùy chọn 1. Bạn không muốn "kỳ diệu" like "nếu giá trị của trường X là trống sau đó xóa các kỷ lục". – Zabba
Tôi đã cập nhật câu hỏi với giải pháp bạn đã đề xuất. –
@Zabba, tôi đang tái cấu trúc mã này sau 18 tháng và bạn đã đúng. Ý tưởng của tôi về việc tẩy trống giá trị như một "phép thuật" phá hủy_addrs' là não chết. Tôi cũng tin rằng bất kỳ giải pháp nào liên quan trực tiếp đến việc sửa đổi mảng 'params' là thực hành không tốt. Bất kỳ xử lý hậu xử lý nào phải được thực hiện sau 'assign_attributes' nhưng trước khi' lưu' –