在Rails中访问模型属性

Mal*_*har 6 ruby model ruby-on-rails

所以基本上我有一个控制器.这样的事情

def show
 @user = User.find[:params[id]]
 #code to show in a view
end
Run Code Online (Sandbox Code Playgroud)

用户具有名称,地址,性别等属性.如何在模型中访问这些属性?我可以为名称重载模型访问器,例如将其替换为我自己的值或将其连接到它.就像在此方法的show.html.erb视图中一样,我可能希望将用户的名称与'Mr.'连接起来 或'太太' 取决于性别?这怎么可能?

Mag*_*nar 9

我会毫不犹豫地覆盖属性,而是像这样添加到模型中:

def titled_name
    "#{title} #{name}"
end
Run Code Online (Sandbox Code Playgroud)

但是,您可以直接访问这些字段,如下所示:

def name
    "#{title} #{self[:name]}"
end
Run Code Online (Sandbox Code Playgroud)


Ste*_*eet 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
Run Code Online (Sandbox Code Playgroud)

如果您希望在读取或写入时显式更改属性的值,则可以使用read_attribute或write_attribute方法.(虽然我认为这些可能会被弃用).

这些工作通过用您自己的属性替换属性的访问器方法.例如,分支标识符字段可以输入为xxxxxx或xx-xx-xx.因此,当数据存储在数据库中时,您可以更改branch_identifier =方法以删除连字符.这可以这样实现

def branch_identifier=(value)
  write_attribute(:branch_identifier, value.gsub(/-/, '')) unless value.blank?
end
Run Code Online (Sandbox Code Playgroud)