更新后有没有办法分配attr_readonly
?
attr_readonly, on: :update
如果没有,也许是方法
@post.update(content: params[:content])
@post.readonly
答案 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) 瞧!