无法更新rails中的整数字段

时间:2012-11-21 13:30:51

标签: ruby-on-rails-3 sqlite

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;删除它

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

  • 跳过验证。

  • 调用回调。

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

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

您的用户模型中是否有回调? 确保在回调中的某个位置未更新列。