Доступ к свойствам модели в Rails - PullRequest
6 голосов
/ 20 августа 2009

Так что в основном у меня есть контроллер. как то так

def show
 @user = User.find[:params[id]]
 #code to show in a view
end

У пользователя есть такие свойства, как имя, адрес, пол и т. Д. Как получить доступ к этим свойствам в модели? Могу ли я, например, перегрузить модель доступа к имени и заменить ее собственным значением или связать что-то с ней. Как и в представлении show.html.erb для этого метода, я мог бы захотеть объединить имя пользователя с «Mr.» или "миссис" в зависимости от пола? Как это возможно?

Ответы [ 6 ]

9 голосов
/ 20 августа 2009

Я бы не стал переопределять атрибуты и вместо этого добавил бы к модели вот так:

def titled_name
    "#{title} #{name}"
end

Однако вы можете получить доступ к полям, как показано ниже:

def name
    "#{title} #{self[:name]}"
end
5 голосов
/ 20 августа 2009

Вы можете создать виртуальные атрибуты в вашей модели для представления этих структур.

Существует 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
0 голосов
/ 21 августа 2009

в http://api.rubyonrails.org/classes/ActionController/Base.html

поиск

Overwriting default accessors
0 голосов
/ 20 августа 2009

Я склонен использовать вспомогательные методы, добавленные в модель для таких вещей:

def formatted_name
  "#{title} #{first_name} #{last_name}"
end

(Отредактируйте предыдущий пост. Посмотрев на мой код, я понял, что помощники должны быть только для материалов, связанных с презентацией.)

(Снова отредактируйте, чтобы удалить оставшийся параметр ... Черт, не хватает кофе сегодня утром.)

(Снова отредактируйте, чтобы заменить $ на # ... Возможно, мне стоит просто удалить это, а?)

0 голосов
/ 20 августа 2009

Если вы обращаетесь к данным, хранящимся непосредственно в базе данных, вы можете сделать это в виде:

<%= @user.firstname %>
<%= @user.gender %>

и т.д.

Если вам нужно построить пользовательские представления данных, вам нужно будет либо создать помощников, либо расширить модель (как указано выше).

0 голосов
/ 20 августа 2009

Вы можете легко перегрузить атрибуты, как вы предлагаете.

т.е. если имя - это поле в таблице базы данных пользователей, вы можете сделать:

def name
  "#{title} #{read_attribute[:name]}"
end

Функция read_attribute возвращает значение столбца базы данных для поля.

Предостережение : Я не уверен, что это хорошая идея. Если вам нужен метод, который отображает данные модели в измененном виде, у меня будет соблазн не перегружать методы по умолчанию и вызывать их по-другому - это позволит избежать определенного уровня запутывания.

Документация здесь: http://api.rubyonrails.org/classes/ActiveRecord/Base.html (в разделе «Перезапись доступа по умолчанию»)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...