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

Использование attr_accessor в Rails

Когда вы используете attr_reader/attr_writer/attr_accessor в моделях Rails?

4b9b3361

Ответ 1

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

attr_reader может использоваться как одна из нескольких альтернатив для выполнения примерно так:

def instance_value
  "my value"
end

Ответ 2

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

Любой attr_accessor, который вы создаете, изменит соответствующий объект @attr на объект rails, но он будет потерян, когда объект будет уничтожен, если вы не вернете его в базу данных. Иногда вам действительно нужно это поведение, но это необычно в приложении rails.

Теперь в рубине это совсем другая история, и вы в конечном итоге используете их очень часто. Но я был бы удивлен, если бы вы нуждались в них в рельсах - особенно изначально.

Ответ 3

Модели Rails - это только рубиновые классы, которые наследуют от ActiveRecord::Base. ActiveRecord использует attr_accessor для определения геттеров и сеттеров для имен столбцов, которые относятся к таблице классов ruby. Важно отметить, что это только для настойчивости; модели по-прежнему остаются только рубиновыми классами.

attr_accessor :foo является просто ярлыком для следующего:

def foo=(var)
  @foo = var
end

def foo
  @foo
end

attr_reader :foo является просто ярлыком для следующего:

def foo
  @foo
end

attr_writer :foo является ярлыком для следующего:

def foo=(var)
  @foo = var
end

attr_accessor - это ярлык для геттера и сеттера, а attr_reader - ярлык для геттера, а attr_writer - ярлык только для установщика.

В рельсах ActiveRecord использует эти геттеры и сеттеры удобным способом для чтения и записи значений в базу данных. НО, база данных - это только уровень сохранения. Вы должны иметь возможность использовать attr_accessor и attr_reader, как и любой другой класс ruby, чтобы правильно составить свою бизнес-логику. Поскольку вам нужно получить и установить атрибуты ваших объектов за пределами того, что вам нужно сохранить в базе данных, используйте attr_ соответственно.

Дополнительная информация:

http://apidock.com/ruby/Module/attr_accessor

http://www.rubyist.net/~slagell/ruby/accessors.html

Что такое attr_accessor в Ruby?

Ответ 4

Если вы используете его для подтверждения принятия условий terms_of_service, вы должны действительно рассмотреть возможность использования validates: terms_of_service,: принятие = > true. Он создаст виртуальный атрибут и будет гораздо более кратким.

http://guides.rubyonrails.org/active_record_validations.html#acceptance.

Ответ 5

Одним из примеров является наличие нескольких параметров, хранящихся в одном сериализованном столбце. Конструктор форм будет жаловаться, если вы попытаетесь создать текстовое поле для одного из этих параметров. Вы можете использовать attr_accessor для подделки, а затем в действии обновления сохранить его в сериализованном столбце.