在同一字段上使用attr_accessor和attr_accescess
-
11-10-2019 - |
题
以下代码在背景中会发生什么?
class User < ActiveRecord::Base
attr_accessor :name
attr_accessible :name
end
提示:实例化课程时,会坚持到数据库吗?为什么或者为什么不?
解决方案 3
感谢大家的快速答案!我认为,您的答案结合在一起,为我提供了我所需的内容。
(在一个相关的问题中,我遇到了很多零错误,例如“对象不支持#inspect”和“ nil:nilclass”的“未定义的方法”。我现在设法通过删除att_accessor字段来解决它共。)
通过尝试这种特殊情况,这就是我发现的:
实际上,:名称字段不会持续到数据库。
user = User.new(:name=>"somename")
将仅设置对象上的属性,但不会将:名称列持续到数据库。像以下“ Rails Console”输出显示:
> user
=> <User id: nil, created_at: nil, updated_at: nil>
> user.save
=> true
> user
=> <User id:1, created_at: 2011-01-19 12:37:21, updated_at: 2011-01-19 12:37:21>
我认为这是因为 *由attr_accessor制造的设置器将覆盖ActivereCord的setter *(它照顾数据库持久性)。您仍然可以从对象中从:名称字段中检索值:
> user.name
=> "somename"
因此,总而言之,我了解到,在字段上使用atter_accessor可能会导致它们不会持续到数据库。虽然我认为attr_accessible描述了应该从外部访问的数据库中的字段,但在这种情况下似乎并没有改变。
其他提示
attr_accessor是Ruby代码,当您没有数据库中没有列,但仍希望在您的表单中显示字段。允许这一点的唯一方法是 attr_accessor :fieldname
而且,如果需要的话,您可以在视图或模型中使用此字段,但大部分在您的视图中。
attr_accessible允许您列出要允许质量分配的所有列,就像上面的安迪一样。相反的是attr_prottect,这意味着我不希望允许任何人批量分配此字段。更可能是您不希望任何人与之相处的数据库中的一个字段。就像状态字段一样。
在大多数情况下,您无需使用 attr_accessor
如果字段是列 users
数据库中的表格。 Activerecord将为您弄清楚。
attr_accessible
只需允许通过质量分配分配字段(例如, update_attributes
)。这适合安全目的。来自 MassAssignmentsEcurity API文档.
因为它继承 ActiveRecord
, ,当您致电时,它将持续 save
方法(但不是在实例化时)。
如果您没有该模型的任何属性,我假设 ActiveRecord
只需在数据库中保存一个新行(即您的对象只会持续存在 id
)。这是有道理的,因为您以后可能会将属性添加到您的 User
模型,并且持续存在的实例仍应是可以检索的。