Ruby on Rails / Devise - обход пользовательского параметра проверки в модели при сбросе пароля - PullRequest
7 голосов
/ 23 апреля 2011

В моем проекте я изменил регистрационную форму в Devise, добавив опцию: accept через аксессор (пользователь должен принять условия обслуживания, чтобы зарегистрироваться и т. Д.).Если они не согласны, это не проверяет.

Это вызвало проблему, когда пользователь пытался редактировать данные своей учетной записи, когда он искал: согласие проверки, но я смог добавить ', если'и добавил еще один метод доступа с именем: sign_in, который определен в контроллере (я не мог понять, как заставить модель определить, вошел ли пользователь в систему или нет, помощники devise не будут работать для меня в этом).Соответствующие части моей модели User и users_controller выглядят как ...

user.rb

validates :agree, :term_agreement => TRUE, :unless => :signed_in

users_controller.rb

def update
   @user = User.find(params[:id])

   if user_signed_in?
     @user.signed_in = params[:user]
   end

  [...]
end

Итак, все работает нормально... проверка "согласен" переопределяет, когда пользователь уже вошел в систему. Однако я должен найти лучший способ переопределить другой сценарий ... когда пользователь сбрасывает свой пароль и ему нужно его сменить.

Я тестировал учетные записи пользователей и пытался сбросить свой пароль на одной учетной записи, однако меня поразила проверка: согласен ... теперь я должен найти способ переопределить это.Я заметил, что в форме «Изменить пароль» есть скрытое значение поля: reset_password_token, однако я попытался: разве что =>: reset_password_token, но это не сработало бы.

Так каков наилучший способ сделать это?Вдобавок к этому, как я могу иметь или / или условие (если только: подписанный_ин или: сброс_пароль и т. Д.) Для этого: разве что предложение?

Ответы [ 3 ]

12 голосов
/ 23 апреля 2011

Итак, вам нужно подтвердить принятие условий при создании записи?

class User < ActiveRecord::Base
  validates :agree, :acceptance => true, :on => :create
end

:on => :create будет выполнять эту проверку только при создании записи - очень похоже на ответ Брэндона, но без избыточного кода.

Это также избавит вас от необходимости беспокоиться о том, вошел ли пользователь в систему или нет.

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

Я предпочитаю основывать такие вещи на том, является ли запись новой (это единственный раз, когда пользователь будет «регистрироваться»).

class User < ActiveRecord::Base
  validates :agree, :term_agreement => TRUE, :if => :signing_up?

  # Return true if the user is currently signing up
  def signing_up?
    new_record?
  end
end

Ключ должен оставаться вИмейте в виду, что значения :if и :unless являются «методом, процедурой или строкой для вызова, чтобы определить, должна ли валидация происходить [или не должна] произойти» - так что вы можете свободно определять методы для вашей модели для этогоцель.

0 голосов
/ 19 ноября 2015

Я исправил это, настроив devise для обновления атрибутов пароля, если проверка не удалась, но только если атрибуты пароля не содержат ошибок.

См. Мой ответ здесь:

Проверкаошибки вызываются при попытке сброса пароля

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