我已经阅读了几乎所有与 Rails 友好重定向相关的帖子,但我似乎无法弄清楚如何在使用 Devise 进行身份验证后将用户重定向到先前的操作。
这就是我想做的。
- 未登录用户点击“投票”
- 由于“before_filter :authenticate_user!”,用户被定向到登录页面 (我已经走到这一步了)
- 用户登录后,“after_sign_in_path_for(resource)”将用户重定向到上一个操作(投票)。
- 投票动作被投下,然后被重定向到用户单击投票按钮的原始页面。(如果用户已经登录,'request.referer' 会这样做,但由于在这种情况下用户必须通过登录页面,request.referer 不起作用。)
*请注意,我想重定向到上一个“动作”,而不仅仅是“页面”。换句话说,我希望在用户登录后已经执行了预期的操作。
这是我的代码。
class MissionsController < ApplicationController
before_filter :store_location
before_filter :authenticate_user!, :except => [:show, :index]
def vote_for_mission
@mission = Mission.find(params[:id])
if @mission.voted_by?(current_user)
redirect_to request.referer, alert: 'You already voted on this mission.'
else
@mission.increment!(:karma)
@mission.active = true
@mission.real_author.increment!(:userpoints) unless @mission.real_author.blank?
current_user.vote_for(@mission)
redirect_to request.referer, notice: 'Your vote was successfully recorded.'
end
end
end
在我的应用程序控制器中,
class ApplicationController < ActionController::Base
protect_from_forgery
def after_sign_in_path_for(resource)
sign_in_url = "http://localhost:3000/users/sign_in"
if (request.referer == sign_in_url)
session[:user_return_to] || env['omniauth.origin'] || request.env['omniauth.origin'] || stored_location_for(resource) || root_path
else
request.referer
end
end
private
def store_location
session[:user_return_to] = request.referer
end
我认为我的主要问题是,当用户需要登录时,vote_for_mission 操作中的“request.referer”会出现意外,因为前一页是登录页面。不知何故,我想将用户单击投票的页面保存为 FOO -> 将投票操作保存为 BAR -> 重定向到登录页面 -> 当用户登录时,重定向到 BAR -> 执行 BAR 操作后,重定向到 FOO .
在此先感谢您的帮助!