我在name
模型上有Person
属性,每次访问name
属性时,都希望返回name.capitalize
。
在模型中执行以下操作无效,
def name
name.capitalize
end
那么替代方案是什么?
答案 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