Okey我不明白这里可能出现什么问题
我有这个应用程序,用户被批准和管理员,这几天前工作正常
在我看来,我有一个调用我的用户控制器的链接
<%= 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与您尝试更新的列名称相同=&gt;删除它
答案 0 :(得分:2)
永远不要对数据库列支持的属性使用attr_accessor
- attr_accessor
生成的访问者将屏蔽存储在数据库中的值
答案 1 :(得分:1)
update_attribute实际上不只是更新单个列:
跳过验证。
调用回调。
如果该列可用,则更新updated_at / updated_on列。
更新此对象中所有脏的属性。
您的用户模型中是否有回调? 确保在回调中的某个位置未更新列。