5

我正在尝试将用户重定向回他们在登录之前尝试访问的页面(该页面仅对用户可见)。

我将从一个针对我的旅行新动作的前置过滤器开始:

before_filter :authenticate, :only => [:new, :create, :edit, :update, :destroy]

def authenticate
  deny_access unless signed_in?
end 

def deny_access
  store_location
  redirect_to login_path, :notice => "Please log in to access this page."
end

def store_location
  session[:return_to] = request.fullpath
end

这是我的 session_controller.rb 中的新操作和创建操作

def new
  @title = "Log in"
end

def create
  user = User.authenticate(params[:session][:email].downcase, 
                           params[:session][:password])     
  if user.nil?
    flash.now[:error] = "Invalid email/password combination."
    @title = "Log in"
    render 'new'
  else
    sign_in user
    redirect_back_or(root_path)
  end
end

def redirect_back_or(default)
  redirect_to(session[:return_to] || default)
  clear_return_to
end

谢谢!

编辑:删除了我的代码的 MaddHacker 版本,因为这不是我想要的。

4

2 回答 2

4

我通常使用 before_filter 之类的

def login_required
  session[:return_to] = request.fullpath
  redirect_to(login_page_url)
end

然后,当我的登录完成时,我会在会话中查找 return_to:

def login
  # user validation of login here
  url = session[:return_to] || root_path
  session[:return_to] = nil
  url = root_path if url.eql?('/logout')
  logger.debug "URL to redirect to: #{url}"
  redirect_to(url)
end
于 2012-05-10T17:29:03.470 回答
0

好吧,首先您需要调用 store_return_to 方法,然后才能从未经授权的页面重定向到登录页面。然后我认为您需要将方法描述更改为类似def redirect_back_or_default(default = root_path)的内容,以便参数变为可选。

顺便说一句,我真的不明白为什么需要将参数传递给该方法,如果它只是一个默认值,那么您可以在方法本身中进行硬编码。

于 2012-05-10T17:27:51.157 回答