2009-10-31 19 views
7
class Gift < ActiveRecord::Base 
    has_many :contributions 
    accepts_nested_attributes_for :contributions, :reject_if => proc { |a| a['amount'].blank? } 

Đóng góp có thuộc tính: biệt danh. Trong: biểu mẫu mới, nó được điền trước với tên thật của người dùng. Người dùng có thể quyết định thay đổi thành "Chú Bob" (hoặc bất kỳ điều gì). Thật không may, với: reject_if, nếu không có số tiền được chỉ định trong phần đóng góp, thay đổi biệt hiệu bị mất khi: tải lại mới trong trường hợp @gift không hợp lệ. Điều này xảy ra vì các đóng góp lồng nhau bị từ chối. Làm cách nào để chúng tôi giữ nguyên: thay đổi biệt hiệu và chỉ xử lý việc từ chối khi @gift thực sự được lưu?accept_nested_attributes_for &: reject_if. Làm thế nào để ngăn chặn từ chối cho đến khi hiệp hội phụ huynh tiết kiệm?

Trả lời

9
class Gift < ActiveRecord::Base 
    has_many :contributions 
    accepts_nested_attributes_for :contributions, 
    :reject_if => proc { |a| a['amount'].blank? } 
end 

class Contribution < ActiveRecord::Base 
    belongs_to :gift 
    validates_presence_of :nickname, :amount 
end 

... dưới hình thức quà tặng ...

f.text_field :nickname, :value => (params[:gift][:contributions_attributes]['0'][:nickname] rescue @m.full_name) 

này bảo tồn: nickname thay đổi thông qua kiểm chứng thực thất bại và vẫn loại bỏ một đóng góp lồng nhau có chứa: biệt danh mà thôi.

0

Tôi nghĩ bạn đang tìm kiếm xác thực trong mô hình Đóng góp thay vì một mệnh đề: reject_if.

: reject_if sẽ vứt bỏ toàn bộ hồ sơ nếu điều kiện được đáp ứng. Xác thực không thành công trong mô hình đóng góp sẽ chặn lưu quà tặng được liên kết. Tuy nhiên @gift sẽ giữ lại những đóng góp bất kể giá trị số tiền của nó trên một lưu thất bại, cho phép người dùng của bạn cơ hội để sửa nó, khi bộ điều khiển làm lại hành động mới.

Giải pháp là xóa mệnh đề: reject_if khỏi câu lệnh accepts_nested_attributes_for và thêm validates_presence_of_amount vào mô hình Đóng góp.

class Gift < ActiveRecord::Base 
    has_many :contributions 
    accepts_nested_attributes_for :contributions 
    ... 
end 

class Contribution < ActiveRecord::Base 
    validates_presence_of :amount 
    ... 
end 
+0

Có, tôi có validates_presence_of: số tiền trong Đóng góp. Khi biểu mẫu @gift được gửi với: 1) các trường Đóng góp trống, nó hoạt động. (Quà tặng loại bỏ tổ trống.) 2) với: số tiền, nó hoạt động. (Xác nhận được thực hiện.) 3) với một: biệt hiệu nhưng không: số tiền, nó không hoạt động. Đây là trường hợp mặc định, vì chúng tôi muốn biểu mẫu được điền sẵn với tên đầy đủ của người dùng trong: biệt hiệu. Thêm: reject_if => a ['amount']. Blank ?, loại bỏ bất kỳ thay đổi nào người dùng thực hiện thành biệt hiệu. Chúng tôi muốn những thay đổi đó được bảo tồn. Có lý? – Gavin

+0

Nếu đó là trường hợp có thể bạn nên sửa đổi mệnh đề: reject_if thành {| a | ['amount']. && a ['biệt danh']. trống?} – EmFi

Các vấn đề liên quan