所以基本上我有一个控制器。像这样的东西
def show
@user = User.find[:params[id]]
#code to show in a view
end
用户具有姓名,地址,性别等属性。如何在模型中访问这些属性?我可以为名称重载模型访问器,例如将其替换为我自己的值或将其连接到它。就像在此方法的show.html.erb视图中一样,我可能希望将用户的名称与'Mr.'连接起来或'太太'取决于性别?怎么可能?
答案 0 :(得分:9)
我会毫不犹豫地覆盖属性,而是像这样添加到模型中:
def titled_name
"#{title} #{name}"
end
但是,您可以直接访问这些字段:
def name
"#{title} #{self[:name]}"
end
答案 1 :(得分:5)
您可以在模型中创建虚拟属性来表示这些结构。
这个主题有一个railscast但总结一下,你可以在你的模型中做这样的事情
def full_name
[first_name, last_name].join(' ')
end
def full_name=(name)
split = name.split(' ', 2)
self.first_name = split.first
self.last_name = split.last
end
如果您希望在读取或写入时显式更改属性的值,则可以使用read_attribute或write_attribute方法。 (虽然我认为这些可能会被弃用)。
这些工作通过用您自己的属性替换属性的访问器方法。例如,分支标识符字段可以输入为xxxxxx或xx-xx-xx。因此,当数据存储在数据库中时,您可以更改branch_identifier =方法以删除连字符。这可以像这样实现
def branch_identifier=(value)
write_attribute(:branch_identifier, value.gsub(/-/, '')) unless value.blank?
end
答案 2 :(得分:0)
您可以按照建议轻松重载属性。
即。如果name是users数据库表中的字段,则可以执行以下操作:
def name
"#{title} #{read_attribute[:name]}"
end
read_attribute
函数将返回该字段的数据库列值。
警告:我不确定这是个好主意。如果你想要一个以修改的方式显示模型数据的方法,我会试图不重载默认方法,并将它们称为不同的东西 - 这将避免一定程度的混淆。
此处的文档:http://api.rubyonrails.org/classes/ActiveRecord/Base.html(在'覆盖默认访问者'下)
答案 3 :(得分:0)
如果要访问直接存储在数据库中的数据,可以在以下视图中执行此操作:
<%= @user.firstname %>
<%= @user.gender %>
等
如果您需要构建数据的自定义表示,那么您将需要创建帮助程序或扩展模型(如上所述)。
答案 4 :(得分:0)
我倾向于使用为模型添加到模型中的辅助方法:
def formatted_name
"#{title} #{first_name} #{last_name}"
end
(编辑上一篇文章。回顾我的代码并实现帮助者应该仅用于与演示相关(标记)的东西。)
(再次编辑以删除剩余参数...... Geez,今天早上咖啡不够。)
(再次编辑用#替换$ ...也许我应该删除这个吧?)
答案 5 :(得分:-1)