ruby-on-rails Rails attr_readonly不起作用

kxkpmulp  于 2023-10-21  发布在  Ruby
关注(0)|答案(3)|浏览(165)

根据this questionattr_readonlydocumentation,以下应该是可能的:

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。我错过了什么?

58wvjzkj

58wvjzkj1#

来自文件
attr_accessible接受一个可访问的属性列表。所有其他属性都将受到保护
所以attr_accessiblebar属性设置为不受mass赋值的保护。

vktxenjb

vktxenjb2#

你可以把属性,假设,键设置为:

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

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

uinbv5nw

uinbv5nw3#

在Rails 7.1 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"

从Rails 7.1开始,如果我们试图更新一个持久化的只读属性,就会引发一个错误。(请检查您的应用程序配置active_record.raise_on_assign_to_attr_readonly

相关问题