装饰rails中的属性

时间:2009-07-17 15:32:50

标签: ruby-on-rails activerecord

我在name模型上有Person属性,每次访问name属性时,都希望返回name.capitalize

在模型中执行以下操作无效,

def name
  name.capitalize
end

那么替代方案是什么?

3 个答案:

答案 0 :(得分:14)

我建议您使用自定义格式化程序创建辅助方法。

class Person

  def formatted_name
    name.capitalize
  end

end

与覆盖默认实现相比,这是一种更好的解决方案,因为在更新/写入/保存记录到数据库时可能会调用setter和getter。 我记得有一次当我覆盖属性的默认实现时,每次保存记录时,都会使用格式化的值更新属性。

如果您想这样做,可以使用alias_method_chain或利用包括外部模块在内的继承。

class Person

  def name_with_formatter
    name_without_formatter.capitalize
  end
  alias_method_chain :name, :formatter

end

您也可以覆盖名称并从自定义方法中调用read_attribute(:name)

def name
  read_attribute(:name).capitalize
end

def name
  self[:name].capitalize
end

再次,不要这样做。继续创建一个自定义方法。

答案 1 :(得分:2)

但是当name为null时会发生吗?

如果self [:name]返回nil,

capitalize将为nil :: Class抛出一个未定义的方法。

以下内容包括:

def name
  self[:name] ? self[:name].capitalize : nil
end

但我同意您应该创建格式化方法并保持名称方法不变。永远不知道何时需要原始数据。

仅供参考:你的方法不起作用的原因是因为它引起了我喜欢称之为自我引用的循环。您正在重新定义方法,但在新方法中调用方法。因此,您必须使用self[:name]read_attribute来获取内部模型数据。

答案 2 :(得分:0)

试试这个:

def name
  self[:name].capitalize
end