Rails attr_readonly 不起作用

问题描述 投票:0回答:3

根据这个问题attr_readonly

文档
,以下应该是可能的:

class MyModel < ActiveRecord::Base
  attr_accessible :foo
  attr_readonly :bar
end

m = MyModel.create(foo: '123', bar: 'bar') # Should work
m.update_attributes(bar: 'baz')            # Should not work

但是第一个失败了,说我无法批量分配

bar
。我错过了什么?

ruby-on-rails activerecord
3个回答
4
投票

来自文档

attr_accessible
获取可访问的属性列表。 所有其他属性都将受到保护

因此

attr_accessible
bar
属性设置为免受批量分配。


2
投票

您可以将属性 , 假设 ,key 设置为:-

attr_accessible :key

然后再添加一项验证

validate :check_if_key_changed, :on=> :update

private
def check_if_key_changed
  if self.key_changed?
    errors.add(:key,"cant change key")
  end
end

通过这种方式,您将能够在创建时对其进行批量分配,并且还可以确保它不会被更新。


0
投票

attr_accessible
防止更改保留在数据库上,但它允许进行更改并保存在内存中:

class Dashboard < ApplicationRecord
  attr_readonly :name
end
d = Dashboard.create(name: "INITIAL NAME")
d.update(name: "ANOTHER NAME")
d.name #=> "ANOTHER NAME"
d.reload && d.name #=> "INITIAL NAME"
© www.soinside.com 2019 - 2024. All rights reserved.