2010-05-08 63 views
50

您何时在Rails模型中使用attr_reader/attr_writer/attr_accessorattr_accessor在Rails中的用法

+1

我猜你的意思是attr_accessor? – 2010-05-08 05:58:52

+0

啊对。谢谢。 – Ethan 2010-05-08 21:53:34

回答

50

attr_accessor可用于您不想直接存储在数据库中的值,并且只存在于对象的生命周期(例如密码)中。

attr_reader可以作为几种选择之一,做这样的事情:

def instance_value 
    "my value" 
end 
62

永远不要,除非你有特殊的需要。自动数据库支持的访问器为您创建,所以您不必担心。

任何你创建的attr_accessor都会改变rails对象上的相关@attr,但是当对象被销毁的时候这个对象会丢失,除非你把它粘回到数据库中。有时你确实需要这种行为,但在Rails应用程序中这是不寻常的。

现在在红宝石中,这是一个不同的故事,你最终会频繁使用它们。但是如果你需要他们的话,我会很惊讶 - 尤其是最初。

+4

完美 - 谢谢。 (我会加上投票你,但我刚刚在这里,我似乎首先需要15pts ...该机制似乎对新用户不友好。) – Ethan 2010-05-08 21:57:38

+2

注意:从Rails 3.x开始attr_accessible是必需的默认情况下)为每个模型的属性,你想允许写入(例如通过表单POST)。为了向后兼容,这可以在'application.rb'中修改,但是作为一个安全措施被添加,要求你明确地将用户可更新的属性列入白名单。作为一个附加的好处,模型中的所有属性(db列)都可以在模型中看到,因此您不必记住该列的命名方式:-) – 2012-06-29 15:25:26

0

一个示例是在一个序列化列中存储多个选项。如果您尝试为其中一个选项设置文本字段,表单构建器会投诉。你可以使用attr_accessor来伪装它,然后在更新操作中将它保存在序列化列中。

12

Rails模型只是继承自ActiveRecord::Base的ruby类。 ActiveRecord使用attr_accessor s为引用ruby类表的列名定义getter和setter。重要的是要注意,这只是为了持久;模型仍然只是红宝石类。

attr_accessor :foo是简单地为以下的快捷方式:

def foo=(var) 
    @foo = var 
end 

def foo 
    @foo 
end 

attr_reader :foo是简单地为以下的快捷方式:

def foo 
    @foo 
end 

attr_writer :foo是以下快捷方式:

def foo=(var) 
    @foo = var 
end 

attr_accessor是一个舒尔对于获取器和设置器的tcut,而attr_reader获取器attr_writer的快捷键是仅用于设置器的快捷键。

在rails中,ActiveRecord以一种方便的方式使用这些getter和setter来读写数据库的值。但是,数据库只是持久层。您应该可以像使用任何其他ruby类一样自由地使用attr_accessorattr_reader来正确组合业务逻辑。由于您需要在您需要保留到数据库的位置以外获取和设置对象的属性,因此请使用attr_

更多信息:

http://apidock.com/ruby/Module/attr_accessor

http://www.rubyist.net/~slagell/ruby/accessors.html

What is attr_accessor in Ruby?

+0

'attr_reader:foo'生成' foo' getter方法,'attr_writer:foo'生成'foo ='setter方法,'attr_accessor:foo'生成'foo'和'foo ='方法。 – Fatih 2013-10-07 20:10:43

+0

+1法提赫。感谢您的编辑。我编辑了我的回复以包含您的评论 – brycemcd 2013-10-10 20:52:40

相关问题