Ruby on rails 在身份验证之前获取目标路径

Ruby on rails 在身份验证之前获取目标路径,ruby-on-rails,authentication,devise,routing,Ruby On Rails,Authentication,Devise,Routing,我在rails应用程序中使用Desive进行用户身份验证,因此某些路由被包装在一个authenticate标记中,只允许登录的用户访问 authenticate :user do post '/user/orders/new', to: 'user/orders#new', as: :new_user_order end 例如,当用户在未登录时尝试创建新订单时,他们将被重定向到登录页面 我想让用户在登录后直接进入新订单页面。 目前,我们正在使用request.referer,它将用户重

我在rails应用程序中使用Desive进行用户身份验证,因此某些路由被包装在一个authenticate标记中,只允许登录的用户访问

authenticate :user do
    post '/user/orders/new', to: 'user/orders#new', as: :new_user_order
end
例如,当用户在未登录时尝试创建新订单时,他们将被重定向到登录页面

我想让用户在登录后直接进入新订单页面。 目前,我们正在使用
request.referer
,它将用户重定向回他们在尝试创建新订单之前所在的页面。在被发送到登录之前,我似乎想不出一种方法来获取他们的目标路径

有人知道我怎么做吗


谢谢

您需要在控制器中为用户身份验证提供一个前置过滤器,而在路由中不需要提及它。只需将以下代码放入控制器,如果用户未登录,它应该重定向到注册-

 before_filter :authenticate_user

您需要在控制器中为用户身份验证提供一个before过滤器,而不要在路由中提及它。只需将以下代码放入控制器,如果用户未登录,它应该重定向到注册-

 before_filter :authenticate_user

在为(资源或范围)方法在路径中签名后,您需要重写designe的
,您可以在应用程序控制器中执行此操作

def after_sign_in_path_for(resource_or_scope)
  # new_order_path
end

希望有帮助

在为(资源或范围)
方法在路径中签名后,您需要覆盖设备的
,您可以在应用程序控制器中执行此操作

def after_sign_in_path_for(resource_or_scope)
  # new_order_path
end

希望有帮助

您可以在会话[:bookmark]中持久化最后一个url,并通过执行以下操作-

prepend_before_filter :set_bookmark

def set_bookmark
  session[:bookmark] = request.url
end

在SessionController中,您可以使用session[:bookmark]的值(如果存在),或者在

的路径中签名后,您可以在session[:bookmark]中保留最后一个url,并通过执行类似操作-

prepend_before_filter :set_bookmark

def set_bookmark
  session[:bookmark] = request.url
end

在SessionController中,您可以使用session[:bookmark]的值(如果存在)或在登录路径中登录后使用

,这难道不意味着用户在登录后总是被重定向到新的路径吗?身份验证后有多条路径被锁定,因此我需要将其与用户尝试访问的路径动态关联。显然,您需要为此添加条件!这难道不意味着用户在登录后总是被重定向到新的路径吗?身份验证后有多条路径被锁定,因此我需要将其与用户尝试访问的路径动态关联。显然,您需要为此添加条件!有相当多的控制器的功能隐藏在身份验证之后,所以我希望在路由中实现这一点,但如果不可能,那么感谢您的解决方案。只需找出在特定页面上调用哪个控制器即可。可能有大量控制器,但特定页面只有一个控制器。无论何时重新加载页面,您都可以在日志中看到这一点。你会看到一个控制器和它附带的方法。是的,我只是说有多个页面我想这样做,新订单页面只是作为一个例子。我想知道是否有一种方法可以通过在路由中进行更改来避免更改每个控制器。似乎没有。在application_controller中编写一个通用方法,然后在需要的每个控制器中通过before filter调用。有相当多的控制器在身份验证后隐藏了功能,因此我希望在路由中完成此操作,但如果不可能,然后感谢您提供的解决方案。只需找出在该特定页面上调用的控制器。可能有大量控制器,但特定页面只有一个控制器。无论何时重新加载页面,您都可以在日志中看到这一点。你会看到一个控制器和它附带的方法。是的,我只是说有多个页面我想这样做,新订单页面只是作为一个例子。我想知道是否有一种方法可以通过在路由中进行更改来避免更改每个控制器。似乎没有。在应用程序_控制器中编写一个通用方法,然后在需要的每个控制器中通过before filter调用它