您何时在Rails模型中使用attr_reader
/attr_writer
/attr_accessor
?attr_accessor在Rails中的用法
回答
attr_accessor可用于您不想直接存储在数据库中的值,并且只存在于对象的生命周期(例如密码)中。
attr_reader可以作为几种选择之一,做这样的事情:
def instance_value
"my value"
end
永远不要,除非你有特殊的需要。自动数据库支持的访问器为您创建,所以您不必担心。
任何你创建的attr_accessor
都会改变rails对象上的相关@attr
,但是当对象被销毁的时候这个对象会丢失,除非你把它粘回到数据库中。有时你确实需要这种行为,但在Rails应用程序中这是不寻常的。
现在在红宝石中,这是一个不同的故事,你最终会频繁使用它们。但是如果你需要他们的话,我会很惊讶 - 尤其是最初。
完美 - 谢谢。 (我会加上投票你,但我刚刚在这里,我似乎首先需要15pts ...该机制似乎对新用户不友好。) – Ethan 2010-05-08 21:57:38
注意:从Rails 3.x开始attr_accessible是必需的默认情况下)为每个模型的属性,你想允许写入(例如通过表单POST)。为了向后兼容,这可以在'application.rb'中修改,但是作为一个安全措施被添加,要求你明确地将用户可更新的属性列入白名单。作为一个附加的好处,模型中的所有属性(db列)都可以在模型中看到,因此您不必记住该列的命名方式:-) – 2012-06-29 15:25:26
如果您正在使用它来验证接受TERMS_OF_SERVICE的,你真的应该考虑使用只会验证:TERMS_OF_SERVICE,:验收=> true。它会创建一个虚拟属性,并且更加简洁。
http://guides.rubyonrails.org/active_record_validations.html#acceptance。
一个示例是在一个序列化列中存储多个选项。如果您尝试为其中一个选项设置文本字段,表单构建器会投诉。你可以使用attr_accessor来伪装它,然后在更新操作中将它保存在序列化列中。
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_accessor
和attr_reader
来正确组合业务逻辑。由于您需要在您需要保留到数据库的位置以外获取和设置对象的属性,因此请使用attr_
。
更多信息:
http://apidock.com/ruby/Module/attr_accessor
- 1. 在rails中的attr_accessor问题
- 2. 如何使用`attribute_names`方法在rails模型中访问attr_accessor
- 3. Ruby on Rails:用于子模型的attr_accessor
- 4. 在试图跳过验证的rails中使用attr_accessor
- 5. 试图在模型中使用attr_accessor值的Rails 5
- 6. attr_accessor中的method_missing
- 7. attr_accessor在accept_nested_attributes_for中无法访问
- 8. 非模型数组元素的Rails attr_accessor
- 9. Rails 5:attr_accessor抛出NoMethodError(未定义的方法'keys'为nil:NilClass):
- 10. Ruby的attr_accessor魔法定义方法
- 11. Ruby对象/方法/ attr_accessor使用
- 12. Attr_accessor使用表名
- 13. Rails的小儿可用父模型attr_accessor属性
- 14. Rails中的非数据库attr_accessor属性持久性
- 15. 无法访问attr_accessor定义的变量
- 16. 未定义的方法和attr_accessor
- 17. Rails 3.2.8 attr_accessor看起来并没有使用form_tag
- 18. attr_accessor类问题
- 19. attr_accessor for array?
- 20. searchlogic - 搜索attr_accessor
- 21. attr_accessor内视图
- 22. 在这里使用attr_accessor是否更好?
- 23. 在html.erb视图中显示attr_accessor
- 24. Rails认为与attr_accessor模型是有效的,但它不
- 25. “attr_accessor”和“Module”的其他方法的官方文档在哪里?
- 26. 在Rails中,有没有一种方法可以指定你想使用attr_accessor的类型,并使用内置的Rails验证来验证它?
- 27. 用setter和getter方法的长期经典方式表达attr_accessor?
- 28. 什么是datamapper中的attr_accessor - ruby
- 29. attr_accessor spec要通过
- 30. Ruby的attr_accessor不被读取
我猜你的意思是attr_accessor? – 2010-05-08 05:58:52
啊对。谢谢。 – Ethan 2010-05-08 21:53:34