Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 轨道&x2B;角度:登录/注册后重定向_Ruby On Rails_Angularjs_Redirect_Url Redirection - Fatal编程技术网

Ruby on rails 轨道&x2B;角度:登录/注册后重定向

Ruby on rails 轨道&x2B;角度:登录/注册后重定向,ruby-on-rails,angularjs,redirect,url-redirection,Ruby On Rails,Angularjs,Redirect,Url Redirection,我使用Rails+Desive进行登录和注册,但我的前端绝大多数使用角度路由。当有人试图在未登录的情况下转到特定页面时,我希望他们在成功登录后被重定向。通常,这将是一个简单的问题,即在会话中存储路径并在方法的路径中修改后签名。然而,我似乎找不到一种Rails方法可以有效地获得实际路径。我相信我可以通过JS实现这一点,然后将其存储为cookie(或者说Angular),但我更愿意将其保存在Rails中。是否有一种方法我遗漏了,它可以给我实际的路径,包括/#/which/which 似乎以下方法应该

我使用Rails+Desive进行登录和注册,但我的前端绝大多数使用角度路由。当有人试图在未登录的情况下转到特定页面时,我希望他们在成功登录后被重定向。通常,这将是一个简单的问题,即在会话中存储路径并在方法的路径中修改后签名。然而,我似乎找不到一种Rails方法可以有效地获得实际路径。我相信我可以通过JS实现这一点,然后将其存储为cookie(或者说Angular),但我更愿意将其保存在Rails中。是否有一种方法我遗漏了,它可以给我实际的路径,包括/#/which/which

似乎以下方法应该有效:

  request.original_url
基于此()

但它不会返回hashtag或以下参数

也许是因为这个人说的()

#是一个旧的浏览器短路,不会触发请求, 这允许许多js框架构建自己的客户端 除此之外,还要重新安排路线


有没有一种干净的方法来收集Rails中的完整路径,或者我需要进入Angular/JS吗?

我也有同样的问题,但有主干。问题是浏览器不会将URL的锚定部分发送到服务器,所以Rails无法处理这个问题,只有前端的JS

我正在发布对我有效的解决方案

在登录页面中添加此javascript片段(最有可能在app/views/sessions/new.html.haml中)

在SessionController中#创建(或者您可以在"路径"中的"签名"后覆盖设计方法)


我希望这能有所帮助。

非常感谢@bero给出这个漂亮的答案。它工作得很好

我将使用以下变体添加我的2美分:

<!-- app/views/sessions/new.html.erb: -->
<script type="text/javascript">
  cname = 'hash_route'
  // Added a .replace(/^#/, '') here to store '/hash_path' instead of '#/hash_path'
  cvalue = window.location.hash.replace(/^#/, '');
  if(cvalue.length){
    var d = new Date();
    d.setTime(d.getTime() + (3*60*1000)); // enough time to log in
    var expires = "expires="+d.toGMTString();
    document.cookie = cname + "=" + cvalue + "; " + expires;
  }
</script>
我更喜欢将
path\u帮助程序
锚定一起使用,并在
的路径中进行签名后覆盖
(您可能已经有了),而不是自定义设计控制器


但是整个事情都是一样的。

你有没有找到解决这个问题的办法?没有。我最终使用JS创建了一个带有最初请求的URL的cookie,然后在注册后重定向到cookie值(如果存在)或根。功能性的,是的。我想要的,不是。我只是看到了你的回复,不管是谁,我发布了cookie解决方案的代码片段,也许它对某些人也会有用——这与我所做的差不多;如果任何人有一个可以在rails中实现的解决方案,请随意分享。但我找不到它。到目前为止,浏览器没有将锚定部分与请求一起发送到服务器,因此不存在rails纯解决方案。我想Desive应该支持这个解决方案,并通过一个标志来启用它:support\u redirect\u hash\u routes或类似的东西
def create
  # ------- Devise code --------
  self.resource = warden.authenticate(auth_options)
  set_flash_message(:notice, :signed_in) if is_navigational_format?
  sign_in(resource_name, resource)

  # ------- This is the code --------
  # handling the case of redirecting to a link that had a hash route    
  location = after_sign_in_path_for(resource)  

  if cookies[:hash_route].present?
     location+= cookies[:hash_route]
     cookies.delete :hash_route
  end

  respond_with resource, :location => location
end
<!-- app/views/sessions/new.html.erb: -->
<script type="text/javascript">
  cname = 'hash_route'
  // Added a .replace(/^#/, '') here to store '/hash_path' instead of '#/hash_path'
  cvalue = window.location.hash.replace(/^#/, '');
  if(cvalue.length){
    var d = new Date();
    d.setTime(d.getTime() + (3*60*1000)); // enough time to log in
    var expires = "expires="+d.toGMTString();
    document.cookie = cname + "=" + cvalue + "; " + expires;
  }
</script>
# application_controller.rb
  def after_sign_in_path_for(resource)

    if cookies[:hash_route].present?
       anchor = cookies[:hash_route]
       cookies.delete :hash_route
    end

    webpages_app_path(anchor: anchor)
  end