使用布尔属性作为Rails 3中模型的更新操作的条件

时间:2012-06-26 22:37:36

标签: ruby-on-rails ruby-on-rails-3 validation ruby-on-rails-3.1 before-filter

想象一下,我的模型上有一个布尔值和一个字符串属性,其数据如下:

Model.locked => true
Model.status => "Available"

当调用Update动作时,我想使用boolean属性来控制更新是否修改了字符串属性,更新中的所有其他属性都应该保存。

所以,如果

Model.locked => true

我们尝试

Model.status = "Sold"

然后

Model.status => "Available"

目前我有这样的模型......

before_update :dont_update_locked_item, :if => :item_locked?

def item_locked?
  self.locked
end

def dont_update_locked_item
  #Some rails magic goes here
end

如何阻止更新单个属性?

我知道答案会受到伤害,但有人会帮助我。已经很晚了,我很累,而且我很有天赋。 ; - )

2 个答案:

答案 0 :(得分:2)

希望它不会那么伤害:)

class Item < ActiveRecord::Base
  validate :cannot_update_if_locked, :on => :update

  def item_locked?
    self.locked
  end

  def cannot_update_if_locked
    errors.add(:item_id, "is locked") if item_locked?
  end
end

答案 1 :(得分:0)

试试这个:

class Item < ActiveReocrd::Base

  def mass_assignment_authorizer
    super + (locked? ? [] : [:status])
  end
end

参考:

Dynamic attr_accessible