Devise - подтверждение после того, как пользователь отредактировал электронную почту - PullRequest
14 голосов
/ 08 июня 2011

Я пытался понять это в течение 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 с некоторыми путами, и я также переписал фильтр before, который вставляет 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
...

Так как / где я могу контролировать, куда он перенаправляется? Правильно ли я сбрасываю атрибуты подтверждения?

Ответы [ 3 ]

7 голосов
/ 17 июня 2011

У нас была похожая проблема (главным образом потому, что подтвержденный пользователь на самом деле не является утвержденным пользователем в нашей системе) - и решили использовать атрибут user_status. Он имеет 2 статуса - «ожидает», который подтвержден, но еще не утвержден, и «утвержден». Если по какой-либо причине пользователь больше не был одобрен (в вашем случае они изменили свой адрес электронной почты), тогда мы вернем его в состояние ожидания.

У нас в applicationController есть before_filter, чтобы проверить, куда они должны идти, основываясь на их статусе.

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

Надеюсь, это поможет.

5 голосов
/ 11 февраля 2012

комплект обновлений.Это было исправлено в текущей выпущенной версии (2.0)

3 голосов
/ 14 июня 2011

Вы можете подождать, пока не будет выпущен реконфигурируемый модуль (они работают над ним).

На данный момент он находится в пулл-запросе:

https://github.com/plataformatec/devise/pull/1120

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