如何在Rails中设计电子邮件确认后签署用户

时间:2017-10-21 13:31:00

标签: ruby-on-rails ruby authentication devise

我正在尝试从过去7小时后在确认电子邮件后自动登录用户,但是当我点击确认链接时,它会显示"您的电子邮件地址已成功确认。"但不要登录用户。我已在我的确认控制器和路线中写了这段代码

devise_for :users, controllers: {confirmations: 'users/confirmations'}

class ConfirmationsController < Devise::ConfirmationsController
  #private
  def after_confirmation_path_for(resource_name, resource)
    sign_in(resource)
    render plain: "here"
    redirect_to "/admins/view_account", notice: "User deleted."
  end
end

任何帮助都将受到高度赞赏谢谢。

2 个答案:

答案 0 :(得分:1)

请注意,在电子邮件确认之后自动登录曾经是设计的默认行为,然后由于安全措施而更改(3.1之后),因为您可以看到更多herehere

如果您仍想这样做,请根据Devise的版本确保在项目的config/initializers/devise.rb文件中设置以下行:

config.allow_insecure_sign_in_after_confirmation=true

如果您使用的是最新的Devise版本,则可能必须使用app/controllers/users/confirmations_controller.rb上的代码扩展默认控制器,以替换上面提到的控制器代码(请注意提到的名称空间和路径):

class Users::ConfirmationsController < Devise::ConfirmationsController
  def show
    super do |resource|
      sign_in(resource) if resource.errors.empty?
    end
  end
end

并确保您在问题开头粘贴的代码属于config/routes.rb

devise_for :users, controllers: { confirmations: 'users/confirmations' }

希望它有所帮助!

答案 1 :(得分:0)

我自己解决了。

路线应该是这样的

 devise_for :users, controllers: {confirmations: 'confirmations'} do
    #put "confirm_user", to: "confirmations#confirm_user"
    get "confirmation", to: "confirmations#after_confirmation_path_for"
  end

控制器就像这样

class ConfirmationsController < Devise::ConfirmationsController
  #private
   def after_confirmation_path_for(resource_name, resource)
    sign_in(resource)
    #render plain: "here"
    #redirect_to "/admins/"
   end

  def show
    self.resource = resource_class.confirm_by_token(params[:confirmation_token])

    if resource.errors.empty?
      set_flash_message(:notice, :confirmed) if is_flashing_format?
      sign_in(resource) # <= THIS LINE ADDED
      redirect_to "/your path/"
    else
      respond_with_navigational(resource.errors, :status => :unprocessable_entity){ render :new }
    end
  end


end