我正在尝试从过去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
任何帮助都将受到高度赞赏谢谢。
答案 0 :(得分:1)
请注意,在电子邮件确认之后自动登录曾经是设计的默认行为,然后由于安全措施而更改(3.1
之后),因为您可以看到更多here和here
如果您仍想这样做,请根据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