![](/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.