Подтвердить что ты не робот

Каким бы гейтер и сеттер по умолчанию выглядели в рельсах?

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

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

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

def tag_list
    #what goes here
end

FYI Я пробовал

 def tag_list
     @tag_list
 end

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

4b9b3361

Ответ 1

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

Ответ 2

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

def tag_list
  read_attribute(:tag_list)
end

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

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

Ответ 3

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