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

Tim*_*ord 3 ruby-on-rails ruby-on-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  
Run Code Online (Sandbox Code Playgroud)

编辑:

这是控制器的一个片段"

class PostsController < ApplicationController

  def publish
    if request.post? 
      post = Post.find(params[:id].to_i)     
      post.publish(current_user)       
      redirect_to(post, :notice => '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

  ...
Run Code Online (Sandbox Code Playgroud)

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

Sim*_*tti 5

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
Run Code Online (Sandbox Code Playgroud)

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

  • 这绝对是失踪的"自我".在两个方面都是正确的+1. (2认同)