Как будет выглядеть метод получения и установки по умолчанию в рельсах? - PullRequest
24 голосов
/ 08 января 2012

Я знаю, что могу написать attr_accessor: tag_list, чтобы создать виртуальный атрибут tag_list для объекта в Rails. Это позволяет использовать атрибут tag_list в формах для объекта.

Если я использую attr_accessor: tag_list, я могу в модели выполнить действия над tag_list для извлечения и манипулирования данными из формы.

То, что я хочу знать, - это вместо того, чтобы писать attr_accessor, как написать геттер и сеттер, которые бы полностью повторяли стандартные функции attr_accessor. EG:

def tag_list
    #what goes here
end

К вашему сведению, я пытался

 def tag_list
     @tag_list
 end

Это НЕ работает.

Ответы [ 3 ]

66 голосов
/ 08 января 2012

attr_accessor является встроенным методом Ruby и не имеет особого значения в контексте ActiveRecord.attr_accessor :tag_list в основном эквивалентен этому коду:

# getter
def tag_list
  @tag_list
end

# setter
def tag_list=(val)
  @tag_list = val
end

Однако в моделях ActiveRecord может потребоваться что-то вроде этого:

def tag_list
  self[:tag_list]
end

def tag_list=(val)
  self[:tag_list] = val
end

Существует небольшая разница:В первом методе obj[:tag_list] не использует ту же память, что и ваши методы получения и установки.С последним это так.

Объяснение концепции получения / установки

В Ruby следующие две строки кода эквивалентны

thing.blabla
thing.blabla()

Обе вызывают методblabla объекта thing и вычисление до последнего выражения, вычисленного в этом методе.Это означает, что вам также не нужен оператор return в случае вышеупомянутого метода getter, потому что метод просто возвращает последнее выражение в методе (@tag_list, значение переменной экземпляра).

Кроме того, эти две строки кода эквивалентны:

thing.blabla=("abc")
thing.blabla = "abc"

Оба вызывают метод blabla= объекта thing.Специальное имя с символом = может использоваться как любое другое имя метода.

Тот факт, что атрибуты , как их иногда называют, на самом деле являются простыми методами, вы также можетеиспользуйте некоторую специальную логику, преобразованную на значениях, прежде чем возвращать или принимать их.Пример:

def price_in_dollar
  @price_in_euro * 0.78597815
end

def price_in_dollar=(val)
  @price_in_euro = val / 0.78597815
end
9 голосов
/ 08 января 2012

При использовании ActiveRecord это эквивалентные версии геттера и сеттера:

def tag_list
  read_attribute(:tag_list)
end

def tag_list=(val)
  write_attribute(:tag_list, val)
end

Это то, что вы искали?

0 голосов
/ 31 августа 2015
Notice the code below is in the [Helpers] path. Helpers are now included for                            
all [Controllers] to work from when instantiated.

module SettergettersHelper

#TODO Wayne 
mattr_accessor :nameport
#TODO Wayne Mattingly the code below was replaced BY ABOVE 
#TODO and not depricatable RAILS 4.2.3

# def nameport
#   @nameport 
# end

# def nameport=(nameport)
#   @nameport = nameport 
#end
end

*Getter from Accounts Controller:*
def index
   @portfolio_name = nameport     
end
*Setter from Portfolio Controller:*
def show
    @portfolio_name = @portfolio_name.portfolio_name #from database call
    SettergettersHelper.nameport =  @portfolio_name # set attribute
end
...