update_attribute/s() вызывает обратный вызов для сохранения пароля

Я пытаюсь обновить один атрибут пользовательской модели с контроллера администратора (а не контроллера пользователя).

Делая это, я пытался update_attribute() но он также менял пароль пользователя.

Я думаю, что пароль меняется, потому что у меня есть метод before_save на пользовательской модели, который хэширует пароль.

update_attributes() не работает, потому что он проверяет проверки пароля, который presence=>true

Есть ли способ добиться этого?

5 ответов

Решение

Пытаться update_column(name, value)это может сработать.

Вы можете установить условие для ваших проверок, используя :if вариант. В моем коде это выглядит примерно так:

validates :password,
          :length => { :minimum => 8 },
          :confirmation => true,
          :presence => true,
          :if => :password_required?


def password_required?
  crypted_password.blank? || password.present?
end

Так что, в основном, это только если crypted_password в базе данных не установлено (имеется в виду, что создается новая запись) или если новая password при условии, что проверки выполняются.

Вы можете обновить один атрибут пользователя, как это

@user is that user whose attribute you want to update

например, user_name

       @user.update_attributes(:user_name => "federe")

Попробуйте, и он обновит только один атрибут.

Пытаться:

Чтобы обойти обратный вызов и проверки используйте:

User.update_all({:field_name => value},{:id => 1})

Просто хотел, чтобы вы знали:

  • В Rails метод update_attribute обходит проверки моделей, тогда как update_attributes и update_attributes! потерпит неудачу (вернет false или вызовет исключение соответственно), если запись, которую вы пытаетесь сохранить, недействительна.

  • Разница между ними заключается в том, что update_attribute использует save(false), тогда как update_attributes использует save или вы можете сказать save(true) .

ActiveRecord имеет метод "update-column", который пропускает проверки и обратные вызовы:

http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html

Однако я бы предположил, что это может быть опасно - у вас есть такой фильтр:before_save по причине. Если вы поместите метод:exc на фильтр, чтобы обойти в определенных случаях, он не только станет многократно используемым, но вы сохраните поведение согласованным и избежите того, чтобы метод был похоронен в контроллере, который обходит стек проверки / обратного вызова вашей модели.

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

Другие вопросы по тегам