Ruby on rails 在同一字段上使用attr\u accessor和attr\u accessible

Ruby on rails 在同一字段上使用attr\u accessor和attr\u accessible,ruby-on-rails,field,attr-accessible,attr-accessor,Ruby On Rails,Field,Attr Accessible,Attr Accessor,下面的代码在后台会发生什么 class User < ActiveRecord::Base attr_accessor :name attr_accessible :name end class用户

下面的代码在后台会发生什么

class User < ActiveRecord::Base

 attr_accessor :name
 attr_accessible :name

end
class用户

提示:实例化该类时,是否将其持久化到数据库?为什么或为什么不?

因为它继承了
ActiveRecord
,所以当您调用
save
方法时(但不是在实例化时),它将被持久化


如果您没有该模型的任何属性,我假设
ActiveRecord
将只在数据库中保存一个新行(即,您的对象将只有一个持久化的
id
)。这是有意义的,因为您以后可能会将属性添加到
用户
模型中,并且持久化实例应该仍然可以检索。

在大多数情况下,如果字段是数据库中
用户
表中的一列,则不需要使用
attr\u访问器
。ActiveRecord会帮你找到答案的


attr\u accessible
只允许通过批量分配(例如,使用
update\u属性
)分配字段。这有利于安全。来自.attr\u访问器的更多信息是ruby代码,在数据库中没有列,但仍希望在表单中显示字段时使用。允许此操作的唯一方法是
attr\u accessor:fieldname
,如果需要,您可以在视图或模型中使用此字段,但主要是在视图中


attr_accessible允许您列出要允许批量分配的所有列,正如andy在上面回避的那样。与此相反的是attr_protected,这意味着我不希望任何人被允许对该字段进行大规模分配。更有可能的是,它将是数据库中的一个字段,您不希望任何人胡闹。例如状态字段等。

感谢大家的快速回答! 我想,你的答案结合在一起给了我理解这个谜题所需要的部分

(在一个相关的问题中,我遇到了很多nil错误,比如“Object不支持#inspect”和“nil:NilClass的未定义方法‘keys’”。我现在设法解决了这个问题,完全删除了att#u accessor字段。)

通过对这个特殊案例的实验,我发现:

实际上,:name字段不会持久化到数据库中

user = User.new(:name=>"somename")
将仅在对象上设置属性,但不会将:name列持久化到数据库。如以下“rails控制台”输出所示:

> 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_访问器可能会导致它们无法持久化到数据库中。虽然我认为attr_accessible描述了数据库中应该可以从外部访问的字段,但在这种情况下,它似乎没有什么区别。

对于这个极其重要和基本的问题,我所看到的最佳答案。出于某种原因,这通常不是为人们所说的。谢谢。这很好地解释了两者之间的区别,但这并不是问题:当您在同一个字段上使用它们时会发生什么(或者持久性会发生什么)。关于这一点,请参阅下面的总结答案。
> user.name
=> "somename"