Ruby on Rails attr_protected - PullRequest
       26

Ruby on Rails attr_protected

2 голосов
/ 28 сентября 2010

В моей модели пользователя есть следующий код:

attr_protected :email

Я пытаюсь создать новый объект пользователя, но получаю ошибку, защищенную массовым назначением, со следующим кодом.

user = User.new(
    :first_name => signup.first_name,
    :last_name => signup.last_name,
    :email => signup.email,
    :birthday => signup.birthday,
    :encrypted_password => signup.encrypted_password,
    :salt => signup.salt
  )

Кто-нибудь знает, как я могу обойти attr_protected, чтобы заставить этот код работать и присвоить значение электронной почте?

Спасибо.

Ответы [ 4 ]

11 голосов
/ 28 сентября 2010
user = User.new(
  :first_name => signup.first_name,
  :last_name => signup.last_name,
  :birthday => signup.birthday,
  :encrypted_password => signup.encrypted_password,
  :salt => signup.salt
)
user.email = signup.email
2 голосов
/ 28 сентября 2010

Я буквально сегодня написал камень, чтобы разобраться с этой проблемой. Я планирую добавить его на RubyGems.org позже на этой неделе после того, как я сделаю презентацию. Не стесняйтесь проверить код в то же время. http://github.com/beerlington/sudo_attributes

Используя гем, ваш код изменится на:

user = User.sudo_new(
  :first_name => signup.first_name,
  :last_name => signup.last_name,
  :email => signup.email,
  :birthday => signup.birthday,
  :encrypted_password => signup.encrypted_password,
  :salt => signup.salt
)

Вы также можете использовать sudo_create(), если хотите сохранить экземпляр

1 голос
/ 23 июля 2013

update_attributes теперь позволяет вам переопределить защиту, если вы знаете, что хеш безопасен, скажем, для внутреннего использования, где настраиваемые поля не приходят из контролируемого пользователем хеша.

user = User.new({
  first_name: signup.first_name,
  last_name: signup.last_name,
  email: signup.email,
  birthday: signup.birthday,
  encrypted_password: signup.encrypted_password,
  salt: signup.salt
}, {without_protection: true})

Вы также можете рассмотреть роли :

User.new(params, as: :admin)
0 голосов
/ 04 ноября 2010

Ядром защиты является self.attributes =, который, если вы используете self.send, может вызвать специальный скрытый параметр в конце, называемый guard_protected_attributes, как false.

Пример:

self.send(:attributes=, hash, false)

Это полностью пропустит функцию защиты.Он не работает с новым, но вы можете сначала создать объект, затем вызвать тот же метод и сохранить, не слишком больно, я думаю.

...