Столбец Devise Verified_at больше не обновляется после rails 3.2 + devise 2.0 - PullRequest
4 голосов
/ 08 февраля 2012

После обновления до рельсов 3.2 и разработки 2.0 и нажав на ссылку подтверждения, отправленную по электронной почте или скопированную с консоли в процессе разработки, столбец подтвержденный_ат не обновляется. В результате вы не можете войти.

Каков будет подход для исправления этой проблемы, поскольку в журналах ничего не появляется, атрибуты доступны с подтверждением, поэтому столбец должен быть обновляемым.

Ответы [ 2 ]

8 голосов
/ 10 февраля 2012

Несколько осей для устранения неполадок.

Сначала (очевидное :-)) вы активировали подтверждаемое в пользовательской модели

devise : :confirmable

Затем проверьте, что следующие столбцыопределены в вашей базе данных и в вашей модели (аналогично, если вы используете Mongoid другого типа)

## Confirmable
t.string   :confirmation_token
t.datetime :confirmed_at
t.datetime :confirmation_sent_at
# t.string   :unconfirmed_email # Only if using reconfirmable

И, наконец, (я не знаю, относится ли это к вам и к решению проблемы), но произошлаизменение 2.0 в отношении подтверждаемого

Кроме того, некоторые параметры конфигурации были переименованы или удалены:

Devise.confirm_within был переименован в Devise.allow_unconfirmed_access_for;

Что же тогда дает вам консоль rails для нового пользователя, только что упакованного?

Должен дать что-то вроде

User.last
 => #<User .... email: "youremail@example.com", confirmation_token: "abch76UfqHBBxHw97123", confirmed_at: nil, confirmation_sent_at: 2012-02-10 11:06:41 UTC, unconfirmed_email: nil, ....>

И полученную вами ссылку (которую вы также можете вручную скопировать и вставить вбраузер должен быть похож (и соответствовать вышеуказанному токену подтверждения)

<p><a href="http://localhost:5000/users/confirmation?confirmation_token=abch76UfqHBBxHw97123">Confirm my account</a></p>

Пользователь в консоли должен быть соответствующим образом изменен

User.last
 => #<User .... email: "youremail@example.com", confirmation_token:nil, confirmed_at: confirmed_at: 2012-02-10 11:28:04 UTC, confirmation_sent_at: 2012-02-10 11:06:41 UTC, unconfirmed_email: nil, ....>

IЕсли при копировании ссылка в браузере все еще не работает, можете ли вы скопировать последние строки журналов?

те, что вокруг

20:36:51 web.1     | Started GET "/users/confirmation?confirmation_token=abch76UfqHBBxHw97123" for 127.0.0.1 at 2012-02-10 20:36:51 +0900
20:36:51 web.1     | [127.0.0.1] Processing by Devise::ConfirmationsController#show as HTML
20:36:51 web.1     |  [127.0.0.1]   Parameters: {"confirmation_token"=>"abch76UfqHBBxHw97123"}
1 голос
/ 11 февраля 2012

(я переместил его в другой ответ, потому что он заслуживает этого, я думаю)

{"translation_token" => "PAPe74HyVmRheFbaBAaw"} Загрузка пользователя (0,4 мс) ВЫБРАТЬ пользователей. * ОТ пользователей ГДЕusers.confirmation_token = 'PAPe74HyVmRheFbaBAaw' LIMIT 1 (0,2 мс) НАЧАЛО (0,1 мс) COMMIT Завершено 401 Несанкционировано за 15 мс

Используете ли вы вместе с CanCan?Это проблема конфигурации Cancan!Если вы удалите CanCan, он, вероятно, будет работать :-).Тем не менее, в CanCan Wiki есть элегантное решение для этого случая.

Добавьте в свой ApplicationController следующее:

check_authorization :unless => :devise_controller?

https://github.com/ryanb/cancan/wiki/Ensure-Authorization

Условно проверьте авторизацию

По состоянию наCanCan 1.6, метод check_authorization поддерживает опции if и: never.Любой из них принимает имя метода в качестве символа.Этот метод будет вызван, чтобы определить, будет ли выполнена проверка авторизации.Это позволяет очень легко пропустить эту проверку на всех контроллерах Devise, так как они предоставляют devise_controller?Метод.

class ApplicationController < ActionController::Base
  check_authorization :unless => :devise_controller?  
end
...