украшать атрибут в рельсах - PullRequest
5 голосов
/ 17 июля 2009

У меня есть атрибут name на модели Person, и каждый раз, когда я получаю доступ к атрибуту name, я хочу, чтобы name.capitalize возвращался.

Выполнение следующих действий внутри модели не будет работать,

def name
  name.capitalize
end

так, какова альтернатива?

Ответы [ 3 ]

14 голосов
/ 17 июля 2009

Я предлагаю вам создать дополнительный метод с вашими пользовательскими форматерами.

class Person

  def formatted_name
    name.capitalize
  end

end

Это лучшее решение по сравнению с перезаписью реализации по умолчанию, потому что setter и getters могут вызываться при обновлении / записи / сохранении записи в базе данных. Я помню, как однажды я переписал реализацию атрибута по умолчанию и каждый раз, когда запись сохранялась, атрибут обновлялся с отформатированным значением.

Если вы хотите пойти по этому пути, вы можете использовать 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

Опять же, не делайте этого. Вперед, создайте собственный метод.

2 голосов
/ 18 июля 2009

Но что происходит, когда имя равно нулю?

Использование заглавных букв вызовет неопределенный метод для nil :: Class, если self [: name] вернет nil.

Следующие покрытия:

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

Но я согласен, что вы должны создать отформатированный метод и оставить метод name как есть. Никогда не знаешь, когда тебе могут понадобиться необработанные данные.

К вашему сведению: причина, по которой ваш метод не работал, заключалась в том, что он вызывал, как мне нравится называть, самоссылающийся цикл Вы переопределяете метод, но вызываете метод в новом методе. Поэтому вы должны использовать self[:name] или read_attribute, чтобы получить внутренние данные модели.

0 голосов
/ 17 июля 2009

Попробуйте это:

def name
  self[:name].capitalize
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...