Зачем использовать оба атрибута attr_accessor и attr_accessible в одном поле? - PullRequest
0 голосов
/ 05 апреля 2011
attr_accessor :password  
attr_accessible :name, :password, :password_confirmation  

Ответы [ 3 ]

6 голосов
/ 05 апреля 2011

attr_accessor определяет свойство и является частью Ruby. Смотри еще здесь .

attr_accessible делает свойство доступным для массового назначения и является частью Rails. Se больше здесь

5 голосов
/ 05 апреля 2011

Я предполагаю, что вы используете библиотеку аутентификации в своем проекте Rails.Пароль, вероятно, является «виртуальным атрибутом» в вашей модели Rails (например, в таблице базы данных нет столбца пароля).Вам нужны методы доступа к паролям, чтобы сохранить простой текстовый пароль в переменной экземпляра, а затем, вероятно, существует метод обратного вызова, который шифрует / хэширует этот пароль, когда ваша модель сохраняется в базе данных, вероятно, в другом столбце.

3 голосов
/ 05 апреля 2011

Скажите, что, например, в вашей БД есть таблица с именем posts. posts имеет следующие поля: name, encrypted_password. И вам нужно следующую модель Rails:

class Post < ActiveRecord::Base
  attr_accessor :password
  attr_accessible :name, :password, :password_confirmation
end

Без attr_accessible можно было бы установить encrypted_password посредством массового присвоения. По сути, с помощью attr_accessible вы указываете, какие атрибуты могут быть установлены посредством массового назначения (в этом случае оставляя encrypted_password вне цикла.

attr_accessor создает средства доступа в вашем классе для данного имени / символа. В основном то, что он делает для вас:

def password= param
  @password = param
end

def password
  @password
end

Я предполагаю, что в вашем случае attr password используется в обратном вызове before_save / create. Делать что-то с password и устанавливать encrypted_password. Но я только догадываюсь здесь.

Надеюсь, это поможет!

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