ruby-on-rails - Rails 中的默认 getter 和 setter 是什么样子的?

标签 ruby-on-rails ruby ruby-on-rails-3 virtual-attribute attr-accessor

我知道我可以编写 attr_accessor :tag_list 来为 Rails 中的对象创建一个虚拟属性 tag_list。这允许在对象的表单中有一个 tag_list 属性。

如果我使用 attr_accessor :tag_list,我可以在模型中对 tag_list 执行操作以从表单中提取和操作数据。

我想知道的是,除了编写 attr_accessor,我将如何编写一个 getter 和 setter 来完全复制 attr_accessor 的默认功能。例如:

def tag_list
    #what goes here
end

仅供引用,我已经尝试过

 def tag_list
     @tag_list
 end

这行不通。

最佳答案

attr_accessor是内置的 Ruby 方法,在上下文 ActiveRecord 中没有特殊含义。 attr_accessor :tag_list 基本上等同于这段代码:

# getter
def tag_list
  @tag_list
end

# setter
def tag_list=(val)
  @tag_list = val
end

然而,在 ActiveRecord 模型中,您可能想要这样的东西:

def tag_list
  self[:tag_list]
end

def tag_list=(val)
  self[:tag_list] = val
end

略有不同:对于第一种方法,obj[:tag_list] 不使用与 getter 和 setter 相同的存储空间。对于后者,确实如此。

getter/setter概念的解释

在Ruby中,下面两行代码是等价的

thing.blabla
thing.blabla()

两者都调用对象 thing 的方法 blabla 并评估该方法中评估的最后一个表达式。这意味着,在上述 getter 方法的情况下,您也不需要 return 语句,因为该方法只是返回方法中的最后一个表达式 (@tag_list,实例变量的值)。

此外,这两行代码是等价的:

thing.blabla=("abc")
thing.blabla = "abc"

两者都调用对象thing的方法blabla=。带有 = 字符的特殊名称可以像任何其他方法名称一样使用。

事实上,属性,正如它们有时被称为的那样,实际上是简单的方法,你也可以在返回或接受它们之前对值使用一些特殊的逻辑转换。示例:

def price_in_dollar
  @price_in_euro * 0.78597815
end

def price_in_dollar=(val)
  @price_in_euro = val / 0.78597815
end

关于ruby-on-rails - Rails 中的默认 getter 和 setter 是什么样子的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8774837/

相关文章:

ruby-on-rails - Rails 3 与设计 : No route matches/d/users/sign_out

ruby-on-rails - 从多个 Controller 继承。

ruby-on-rails - buggy Rails 应用程序 : test or refactor?

ruby-on-rails - Rails,仅在首页上渲染一个不同的标题

ruby-on-rails - rails 未定义方法 `attr_accessible'

ruby - 算法的大O复杂度

java - 从 Java 到 Ruby 的状态设计模式

ruby-on-rails - ruby 任务调度程序

ruby-on-rails - 为什么这个赋值和每个循环只返回 1 个属性而不是我期望的整个对象?

ruby-on-rails - 在 Rails after_filter 中检测我们是在渲染还是重定向