Ruby on rails 为什么';t:readonly=>;真正的工作属于协会吗?
我有以下型号:Ruby on rails 为什么';t:readonly=>;真正的工作属于协会吗?,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有以下型号: class Question < ActiveRecord::Base belongs_to :user, :readonly => true end 为什么这是真的?我希望:readonly=>true可以防止在初始创建后更改此属性?如果没有,那么:readonly选项实际上做了什么 编辑 使用attr\u readonly将提供我所寻找的不可更改性(不变性?) class Question < ActiveRecord::Base belon
class Question < ActiveRecord::Base
belongs_to :user, :readonly => true
end
为什么这是真的?我希望:readonly=>true可以防止在初始创建后更改此属性?如果没有,那么:readonly选项实际上做了什么
编辑
使用attr\u readonly
将提供我所寻找的不可更改性(不变性?)
class Question < ActiveRecord::Base
belongs_to :user
attr_readonly :user_id
end
类问题
唯一的问题是,当您尝试更改属性时,它不会引发异常,因此很容易从静默失败中获取bug。从文档中
:readonly
If true, the associated object is readonly through the association.
所以我想这会阻止你做一些事情,比如
question.user.name = 'Hacked'
但是让您继续修改关系本身。就像@christianblais所说的,它只影响更改对象的属性,而不是替换它 防止在模型中重新定义user=
class Question < ActiveRecord::Base
belongs_to :user, :readonly => true
def user=(new_user)
if self.user.nil?
write_attirbute :user_id , new_user.id
else
return false # or raise your prefrence
end
end
类问题true
def user=(新用户)
如果self.user.nil?
write_attirbute:user_id,new_user.id
其他的
返回false#或提高优先级
结束
结束
或者您可以消除条件并使其始终引发异常,然后使用new或create对其进行初始化,/update attributes只要属于某个id列,就引用该id列def user=(new\u user)将不会触发,但def user\u id=(new\u user\u id)即可!例如:
类问题true
def user_id=(新用户_id)
如果self.user.nil?
写入属性:用户id、新用户id
其他的
返回false#或提高您的偏好
结束
结束
结束
在Rails4和ruby 1.9.3上进行测试我已经尝试过重新定义用户=。我还使用了attr_readonly,它可以完成任务,但不是很干净,因为当您实际尝试更新属性时,它不会抛出错误。这看起来不错,但它破坏了我的一个测试:。我现在使用的是Ruby 2.1和Rails 4.0.2,“属于…”,attr\u readonly=>true”打破了模型。需要继续找,但谢谢。打得好,我查过了,你很到位。
class Question < ActiveRecord::Base
belongs_to :user, :readonly => true
def user=(new_user)
if self.user.nil?
write_attirbute :user_id , new_user.id
else
return false # or raise your prefrence
end
end