以下代码在背景中会发生什么?

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 模型,并且持续存在的实例仍应是可以检索的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top