Devise - подтверждение после редактирования пользователем электронной почты
Я пытался понять это в течение 2 дней. Я подтверждаю учетные записи пользователей с подтверждением электронной почты (через Devise). Я, наконец, получил все, что работает, но все дело в том, чтобы утверждать, что человек владеет электронным письмом, который, по их утверждению, владеет. Поэтому мне нужно, чтобы он снова подтверждал, когда пользователь меняет свой адрес электронной почты.
Чтобы сделать это, я создал registrations_controller
и переписал метод update
. В основном, исходя из того, что у Devise есть, но я проверяю, нужно ли мне отправлять подтверждение на основе обновления.
# registrations_controller.rb
def update
self.resource = resource_class.to_adapter.get!(send(:"current_#{resource_name}").to_key)
send_confirmation = false
if params[:user][:email] != resource.email
send_confirmation = true
end
if resource.update_with_password(params[resource_name])
set_flash_message :notice, :updated if is_navigational_format?
sign_in resource_name, resource, :bypass => true
if send_confirmation
resource.update_attributes(:confirmed_at => nil, :confirmation_sent_at => nil)
resource.send_confirmation_instructions
end
respond_with resource, :location => after_update_path_for(resource)
else
clean_up_passwords(resource)
respond_with_navigational(resource){ render_with_scope :edit }
end
end
Моя проблема в том, что я не уверен, где в процессе, чтобы иметь возможность изменять, куда он перенаправляется. У меня есть страница, которая объясняет, что "для подтверждения вашей электронной почты было отправлено электронное письмо". Но если я попытаюсь поместить его после send_confirmation_instructions
, когда пользователь нажмет "обновить учетную запись", то они будут выведены из системы (нажаты на экран входа в систему), а затем, когда они подтвердят учетную запись по электронной почте, они направляются на страницу я хотел показать их.
У меня есть специальная стратегия Warden с некоторыми вложениями в нее, и я также написал ранее фильтр, который Devise ставит:
# registrations_controller.rb
def authenticate_scope!
puts "RegistrationsController :: authenticate_scope!"
puts "action : #{params[:action]}"
super
end
Итак, похоже, что он пытается аутентифицировать пользователя. Журнал читается следующим образом:
...
Redirected to http://localhost:3000/users/edit
Completed 302 Found in 3537ms
RegistrationsController :: authenticate_scope!
action : edit
Started GET "/users/edit" for 127.0.0.1 at 2011-06-08 11:42:09 -0500
Processing by RegistrationsController#edit as HTML
User Load (0.7ms) SELECT "users".* FROM "users" WHERE "users"."id" = 19 LIMIT 1
Completed in 83ms
Warden::Strategies authenticate!
Warden::Strategies params: {"action"=>"new", "controller"=>"sessions"}
Started GET "/users/sign_in" for 127.0.0.1 at 2011-06-08 11:42:10 -0500
Processing by SessionsController#new as HTML
...
Итак, как/где я могу контролировать, куда он перенаправляется? Правильно ли я возвращаю атрибуты подтверждения?
Ответы
Ответ 1
У нас была аналогичная проблема (главным образом потому, что подтвержденный пользователь на самом деле не является утвержденным пользователем в нашей системе) - и решил пойти с атрибутом user_status. Он имеет 2 статуса - "ожидающий", который подтвержден, но еще не утвержден, и "одобрен". Если по какой-то причине пользователь больше не был одобрен (в вашем случае они изменили свой адрес электронной почты), мы заменим их на ожидающие.
У нас есть before_filter на applicationController, чтобы проверить, куда они должны идти, исходя из их статуса.
def check_user_status
if current_user #logged in
case current_user.status
when "pending"
redirect_to root_path #user hasn't been approved yet
when "approved"
#tracking logic here
end
end
end
Надеюсь, что это поможет.
Ответ 2
пакетное обновление. Это было исправлено в текущей версии (2.0)
Ответ 3
Вы можете подождать, пока не будет выпущен повторно подтвержденный модуль (они работают над ним).
Пока что в запросе на перенос:
https://github.com/plataformatec/devise/pull/1120