我试图将模型逻辑保留在我的模型中,但是我不能让它对自己进行修改,并且使它们保留在数据库中.
在我的控制器:
@article.perform_some_calulcations!
在我的模型中:
def perform_some_calculations! self.foo.gsub!(/regexp/,'string') self.save end
如果我将调试器语句放在我的方法中,并且在控制器中调用它之后,@ article.foo具有正确的值.但是,当我继续,它不会保留在数据库中,而且webrick不会报告任何UPDATE语句.
怎么了?我不知道我以前是否曾经做过这样的事情,但肯定是可能的吗?
解决方法
你的问题是,如果你修改一个属性“就地”,这意味着:没有给它一个新的值,那么Rails会认为没有什么新的可以被保存,所以它“优化”保存.
您的属性的每个写访问器将设置一个标志,所以保存方法将知道它应该检查当前值是否真的不同于从数据库读取的值.
这就是为什么self.foo = self.foo.gsub(/ regexp /,’string’)的工作原理(注意,感叹号在这里是不必要的).
如果您需要修改属性“就地”,例如使用gsub!或更换,使用:
def perform_some_calculations! foo_will_change! self.foo.gsub!(/regexp/,'string') self.save end