update_attribute/s() вызывает обратный вызов для сохранения пароля
Я пытаюсь обновить один атрибут пользовательской модели с контроллера администратора (а не контроллера пользователя).
Делая это, я пытался update_attribute()
но он также менял пароль пользователя.
Я думаю, что пароль меняется, потому что у меня есть метод before_save на пользовательской модели, который хэширует пароль.
update_attributes()
не работает, потому что он проверяет проверки пароля, который presence=>true
Есть ли способ добиться этого?
5 ответов
Вы можете установить условие для ваших проверок, используя :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, где угодно, кроме как защищенных методов внутри моделей.