Ruby on Rails - Могу ли я изменить значение атрибута до его вызова?

StackOverflow https://stackoverflow.com/questions/181652

Вопрос

Допустим, у меня есть эта модель с именем Product с полем с именем brand . Предположим, что значения brand хранятся в формате this_is_a_brand . Могу ли я определить метод в модели (или где-либо еще), который позволяет мне изменять значение brand до его вызова. Например, если я позвоню @ product.brand , я хочу получить Это бренд вместо this_is_a_brand .

Это было полезно?

Решение

Я бы рекомендовал использовать синтаксис в квадратных скобках ( [] и [] = ) вместо read_attribute и write_attribute . Синтаксис в квадратных скобках короче и разработан для упаковки защищенного методы read / write_attribute .

def brand
  original = self[:brand]
  transform(original)
end

def brand=(b)
  self[:brand] = reverse_transform(b)
end

Другие советы

Вместо прямого доступа к @attributes следует использовать read_attribute и write_attribute :

def brand
  b = read_attribute(:brand) 
  b && b.transform_in_some_way
end

def brand=(b)
  b && b.transform_in_some_way
  write_attribute(:brand, b)
end

Поскольку последний ответ был опубликован 7 лет назад, я сообщу, что такое Rails API в настоящее время предлагает.

def brand
  super.humanize
end

Humanize превращает this_is_a_brand в this это бренд "

В вашей модели вы можете переопределить вызов метода brand .

def brand
#code to modify the value that is stored in brand
return modified_brand
end

Это позволит сохранить его как this_is_a_brand. Но он будет возвращен как «это бренд».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top