attr_readonly更新后

时间:2015-02-16 01:17:44

标签: ruby-on-rails ruby database readonly

更新后有没有办法分配attr_readonly

attr_readonly, on: :update

如果没有,也许是方法

@post.update(content: params[:content])
@post.readonly 

3 个答案:

答案 0 :(得分:2)

您可以像这样覆盖该模型中的readonly?

def readonly?
  super || created_at != updated_at
end

Rails在尝试将更新的记录保存到数据库之前检查记录是否只读,如果记录标记为只读,则会引发ActiveRecord::ReadOnlyRecord异常。如果记录至少更改一次(由readonly?true上的不同时间戳指示),则此覆盖的updated_at方法可以保护记录不会被更改两次,始终返回created_at

此外,您还可以查看视图item.readonly?以隐藏指向编辑页面的链接。

答案 1 :(得分:0)

你可以创建一个before_update

 before_update :forbid_second_update

 def forbid_second_update
   if created_at != updated_at_was
     errors.add :base, "Cannot updated!"
     false
   end
 end

第一次更新将成功,因为created_at和updated_at将是相同的

第二次失败

或者如果你想锁定一些属性并且不想让更新失败,你可以添加例如。

 self.email = self.email_was 

这会将email属性覆盖为旧值

答案 2 :(得分:0)

您可以在模型中添加计数

rails g scaffold sport name
rails g migration add_modified_count_to_sports modified_count:integer

我正在指定默认值

class AddModifiedCountToSports < ActiveRecord::Migration
  def change
    add_column :sports, :modified_count, :integer, default: 0
  end
end

rake db:migrate

在我的Sport模型中,我创建了一个before_update类型的验证

class Sport < ActiveRecord::Base

  before_update :validate_update_status

  def validate_update_status
    unless self.modified_count.eql?(1)
        #if the field 'modified_count = 0'
        self.modified_count = 1
    else
        errors.add(:name,'You can only modified your account once')
        false
    end#end unless

  end#def

end#class

您也可以使用像gem这样的状态机实现相同的功能(即assm) 瞧!