0

好吧,我只是不明白这里有什么问题

我有这个应用程序,用户由管理员批准,直到几天前它工作正常

在我看来,我有一个调用我的用户控制器的链接

<%= link_to 'Approve', active_user_path(user), :method => :put %>

这是我对该链接的自定义路线

match "users/:id/activate" => "users#activate", :as => "active_user"

现在在我的用户控制器中我有这个激活方法

def activate
  @user = User.find(params[:id])

  puts @user.name #the correct name is displayed
  puts @user.is_approved.inspect.to_i #:is_approved is 0

  if @user.update_attribute(:is_approved, 1) 

  puts @user.is_approved.inspect # :is_approved is 1

  @user.activate_user

  puts @user.is_approved.inspect # :is_approved is 1

  @user.save!

  redirect_to "/users?is_approved=0"

  else
   render "/" # dosn't matter
  end 
end

我尝试在这里保存 3 次(更新、激活用户、保存!)但仍然不会保存值,用户is_approved字段仍然是 0,这怎么可能?

这是我的模型方法

def activate_user
  self.is_approved = 1
  self.save
end

顺便说一句,我可以用这种方法更新字符串,但不能更新整数(true 和 false dosnt 都可以)

在我的模型中,我is_approved同时拥有 attr_accessible 和 attr_accessor

解决方案

好吧,这很尴尬,但是碰巧在我的用户模型attr_accessor :approved 中,这导致该模型从未进入数据库来更新:approved列,而是更新了局部变量:approved,因此下次当我查看该列时,当然:approved价值没有改变

tldr?如果您的模型中有 attr_accessor 与您尝试更新的列同名 => 删除它

4

2 回答 2

2

永远不要attr_accessor在由数据库列支持的属性上使用 - 生成的访问器attr_accessor将屏蔽存储在数据库中的值

于 2012-11-21T14:32:29.637 回答
1

update_attribute实际上不仅仅是更新单个列:

  • 验证被跳过。

  • 调用回调。

  • 如果该列可用,则更新 updated_at/updated_on 列。

  • 更新此对象中所有脏的属性。

您的用户模型中是否有任何回调?确保该列没有在回调中的某处更新。

于 2012-11-21T14:31:05.043 回答