关于ruby:在Rails中使用attr_accessor

usage of attr_accessor in Rails

在Rails型号中,您何时使用attr_reader/attr_writer/attr_accessor


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

您创建的任何attr_accessor都将更改Rails对象上的相关@attr,但当对象被销毁时,这将丢失,除非您将其粘贴回数据库中。有时候你确实想要这种行为,但在Rails应用程序中这是不寻常的。

现在在Ruby中,情况就不同了,最后你会经常使用这些。但如果你在铁路上需要它们,我会很惊讶的——尤其是最初。


attr_访问器可用于您不希望直接存储在数据库中的值,而这些值仅在对象的生命周期(例如密码)内存在。

ATTR读卡器可以作为完成类似工作的几种备选方案之一:

1
2
3
def instance_value
 "my value"
end


Rails模型只是从ActiveRecord::Base继承的Ruby类。ActiveRecord使用attr_accessor为引用Ruby类表的列名定义getter和setter。需要注意的是,这只是为了持久性;模型仍然只是Ruby类。

attr_accessor :foo只是以下各项的捷径:

1
2
3
4
5
6
7
def foo=(var)
  @foo = var
end

def foo
  @foo
end

attr_reader :foo只是以下各项的捷径:

1
2
3
def foo
  @foo
end

attr_writer :foo是以下各项的快捷方式:

1
2
3
def foo=(var)
  @foo = var
end

attr_accessor是getter和setter的快捷方式,attr_reader是getter的快捷方式,attr_writer是setter的快捷方式。

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

更多信息:

http://apidock.com/ruby/module/attr_访问器

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

Ruby中的attr_accessor是什么?


如果您使用它来验证对"服务"条款的接受,您应该真正考虑使用validates:terms"服务",:acceptance=>true。它将创建一个虚拟属性,并且更加简洁。

http://guides.rubyonrails.org/active_record_validations.html接受。


一个例子是在一个序列化列中存储了许多选项。如果您试图为这些选项中的一个设置文本字段,那么表单生成器会抱怨。您可以使用attr_访问器来伪造它,然后在更新操作中将其保存在序列化列中。