![](/img/trans.png)
[英]In Rails how do I test modifications to an instance of a Model that are made in a controller?
[英]How do I prevent modifications to a Model?
在當前項目中,我有一個名為Box
的模型,該模型存儲在線商店中的商品。 包裝盒屬於“ Package
(定義價格,付款條件等),並具有許多Item
和ExtraItem
對象,用於容納包裝盒中包含的產品和額外優惠。
當客戶用產品和額外優惠填充盒子並進行結帳時,將創建一個類Purchase
的新對象,並引用包含其項目的Box
。
Purchase
具有名為total的屬性,該屬性從包含項目的框(在before_validation掛鈎上)獲取總貨幣值,並且即使產品價格發生變化也保留已支付總金額的記錄。 我擔心的是,即使在確認並創建購買后,仍可以更改其所屬的框 (可以添加/刪除項目),創建的記錄不能反映購買時的實際情況。
為了防止對box進行更改,我創建了一個方法,該方法掛在after_initialize和initialize方法上,以防止在鎖定屬性設置為true的情況下調用特定的屬性更改方法。 它的工作方式如下:
def trigger_locked_box_behavior
if locked?
[:items,:extra_items,:garrisons].each { |p| (send("#{p.to_s}")).freeze }
[:package=, :package_id=, :box_behavior_type=, :resource=, :resource_id=, :resource_type=].each do |param|
class_eval do
define_method(param) do |*args|
raise LockedBoxError
end
end
end
end
end
它基本上凍結了關聯(一個盒子包含許多物品 , 額外 物品和駐軍 ),並重新定義了某些方法,以在調用時引發LockedBoxError異常。
由於這似乎按預期工作,我真的很擔心這種方法會導致意外的行為,我正在尋找一種方法來實現相同的效果, 而無需覆蓋我正在做的方法!
你們知道我有什么辦法嗎? 非常感謝您的幫助! :)
我將使用attr_readonly將您的屬性標記為只讀。 它們將在您創建記錄時創建,但此后將無法更新。
參見http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-c-attr_readonly
您也可以使用readonly!使記錄變為只讀。
可以在這里找到文檔: http : //api.rubyonrails.org/classes/ActiveRecord/Base.html#method-i-readonly-21
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.