Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.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 使用rails登录到主干路由后重定向_Ruby On Rails_Angularjs_Backbone.js - Fatal编程技术网

Ruby on rails 使用rails登录到主干路由后重定向

Ruby on rails 使用rails登录到主干路由后重定向,ruby-on-rails,angularjs,backbone.js,Ruby On Rails,Angularjs,Backbone.js,我试图为用户提供一个通用功能,在登录到安全路径后面最初请求的url后将他们重定向。例如,用户单击系统中通过通知触发的电子邮件中的链接,尝试转到: 用户未登录,因此返回到 登录后,他们不应该被带到他们的主页,而是带到最初请求的url 我熟悉在重定向到登录页面之前在会话中存储尝试的URL的技术。问题是URL是否在核心URL之后包含主干路由器,即 URL的#细节部分似乎没有发送到服务器,因为这通常用于内部页面跳转。我想知道,随着诸如主干、angular等JS MVC框架的出现,web开发人员是如何处

我试图为用户提供一个通用功能,在登录到安全路径后面最初请求的url后将他们重定向。例如,用户单击系统中通过通知触发的电子邮件中的链接,尝试转到: 用户未登录,因此返回到 登录后,他们不应该被带到他们的主页,而是带到最初请求的url

我熟悉在重定向到登录页面之前在会话中存储尝试的URL的技术。问题是URL是否在核心URL之后包含主干路由器,即

URL的#细节部分似乎没有发送到服务器,因为这通常用于内部页面跳转。我想知道,随着诸如主干、angular等JS MVC框架的出现,web开发人员是如何处理这个问题的?什么把戏?有没有办法在http规范中真正将#传递给服务器


非常感谢您提出的任何建议。

如果您不需要为较旧的浏览器支持此行为,则此问题的最简单解决方案是在主干路由器中启用pushState,这样您就不会对路由使用

Backbone.history.state({pushState:true});

编辑:

另一个可能的解决方案,虽然有点混乱,但它是做一些愚蠢的URL操作,以找出散列之后应该是什么,然后导航到该路径

例如,假设您希望导航到:

http://webapp.com/abc/#page1
其中“page1”是组成主干路由的片段

如果您改为将用户发送到
http://webapp.com/abc/page1
。您可以检测浏览器是否具有pushState。如果不是,您可以用散列替换“根”后面的所有内容。下面是一些示例代码,可以帮助您正确地支持这两组浏览器:

var\u默认值={
国家:现代化历史,
沉默:是的,
根:'/'
};
var start=功能(选项){
//使用pushstate或不使用pushstate启动布线
options=.extend(.clone(this.\u默认值),options);
主干。历史。开始(选项);
if(options.pushState){
Backbone.history.loadUrl(Backbone.history.getFragment());
返回;
}
this.degradeToNonHistoryURL();
};
/**
*对于片段URL,我们检查实际请求是否针对根,即“/”,
*如果是的话,我们可以继续,脊梁骨将发挥神奇的作用
*如果不是,我们重定向到根目录,路由作为一个片段
*foo.com/bar/1->foo.com/#bar/1
*/
degradeToNonHistoryURL=函数(){
var pathName=window.location.pathName;
//如果根为“/”,则长度为1。如果根为“foo”,则长度为5(/foo/)
var rootLength=\u getRoot().length;
var isRootRequest=pathName.length==rootLength;
如果(!isRootRequest){
var route=pathName.substr(rootLength);
window.location.href=_getRoot()+'#'+路由+window.location.search;
返回;
}
Backbone.history.loadUrl(Backbone.history.getFragment());
},
/**
*获取应用程序的有效根目录。通常是“/”,但如果设置为“foo”,我们需要
*返回“/foo/”,以便更容易地确定这是否是根请求。
*@返回{String}有效根
*/
_getRoot=函数(){
if(Backbone.history.options.root==='/')){
返回“/”;
}
返回“/”+Backbone.history.options.root+“/”;

},
经过一些研究,似乎只有两种解决方案

  • 正如Will所建议的,使用pushState并且只支持HTML5浏览器,但是这对于使用hash或hashbang javascript导航的现有应用来说是一个巨大的改变

  • 解决方法在服务器端,这里的主要选项是提供重定向端点,以让用户到达需要去的地方。例子 /myapp/redirector?路径根=通知&哈希根=详细信息&哈希参数1=2 这将在服务器端建立一个url /myapp/通知/1#详细信息/2


  • 因此,在#2中,服务器无法接收带有hashtags的http请求,但可以发送它们。浏览器将接收包括hash nav部分的完整路径,并执行其正常的javascript MVC路由操作。

    如果您为未登录的用户提供完整的URL路径,这是如何工作的?URL的一部分是否根据URL参数确定要访问哪个BB视图?以下是一些解释哈希和hashbang标记不理想的文章。这是一篇关于理解pushstate的文章,我会给你+1,但是这需要一个很大的改变,对于现有的应用程序,我认为不付出很大的努力是不可行的。我希望有另一个解决方案,我想不是。嘿,bmj88,我添加了一些我刚才编写的代码的细节来处理这个问题。过来看。