为什么我的模型实例的更改有时不会在Rails 3中保存?

我有一个名为Post的模型,我在模型中创建了两个对字段进行更改的方法。 调用save时,第一个方法的更改会保持不变。 第二种方法的更改不会被保存。 我之前在其他模型中已经注意到了这种行为,我认为我缺少一些关于模型如何工作的基本知识。 任何有关这方面的帮助将不胜感激!

class Post < ActiveRecord::Base def publish(user) # These changes get saved reviewed_by = user touch(:reviewed_at) active = true end def unpublish() # These changes get ignored. reviewed_by = nil reviewed_at = nil active = false end end 

编辑:

这是控制器的一个片段“

 class PostsController  'Post was successfully published.') end end def unpublish if request.post? post = Post.find(params[:id].to_i) post.unpublish() redirect_to(post, :notice => 'Post was successfully unpublished.') end end ... 

更新通过向模型中更改的所有属性添加self来解决问题。 谢谢Simone Carletti

publish您调用方法touch来保存对数据库的更改。 在unpublish ,您不会将任何内容保存到数据库中。

如果要更新模型,请确保使用将更改保存到数据库的方法。

 def publish(user) self.reviewed_by = user self.active = true self.reviewed_at = Time.now save! end def unpublish self.reviewed_by = nil self.reviewed_at = nil self.active = false save! end 

此外,确保在设置值时使用self.attribute,否则该属性将被视为局部变量。

根据我的经验,您不会保留更改,直到您保存它们为止

  • 在控制器中显式调用Model.save
  • 在控制器中显式调用Model.update_attributes(params[:model_attr])
  • 如果你想在你的模型中保存一个属性,我看到像write_attribute :attr_name, value但TBH我从未使用它。

干杯