Rails redirect_to 有大量的数据需要传送,会报错 URL too large,何解?

macknight · 2015年01月20日 · 最后由 macknight 回复于 2015年01月28日 · 3896 次阅读

求大神解答,

redirect_to 有大量的数据需要传送,会报错 URL too large,何解? redirect_to 不能用 post

import_result = Product.import(params[:file], params[:operator_id]) # array redirect_to products_path(:import_result => import_result)

到页面会报错 URL too large,何解?

修改 nginx client_max_body_size 这个值呢

大量是多大?我记得 url 有长度限制是 两千多字符?记不大清了

超过了 GET 的数据长度吗?

改成:render json: import_result.as_json 就可以了吧。

URL GET 有长度限制,这类情况你需要 POST

#5 楼 @huacnlee yep,我谷歌到 URL GET 有限制,可修改 nginx 设置,不过这个还是不太好。但是 redirect_to 也可以用 post 吗?我搜了下,说是 redirect_to 不能用 post 呢?

#4 楼 @ruby_sky 我要 redirect_to。。。

#3 楼 @debugger yep,超过默认值

#2 楼 @blacktulip 是超过了的,所以问 redirect_to 如何带大参数

#1 楼 @davidminaki 这个是个方法,但是不太好,不解决根本问题,如果再大,那不是还要再调大服务器的设置嘛。

#10 楼 @mingyuan0715 有简单点得方法嘛?类似 redirect_to POST,但是我搜索了说 redirect_to 不能用 POST 呢。。

两种方法:

  1. 立即 render 结果。
  2. 把处理结果持久化,redirect 到以 id 为参数的路径。

get 方法 url 长度限制是突破不了的,你可以 render 构建一个表单自动提交 post 过去就好了

最好换种思路

#13 楼 @Rei 我用了第一种方法,但是浏览器的路径就变成了我的 render 的那个方法的路径,如何设置为我像 redirect_to 的路径 index 呢?

#14 楼 @xxqfamous 你是说在 render 的 view 里面搞个隐藏的 form 表单自动提交?但是这样会有页面跳转嘛?可以有跳转,但是不希望有页面的切换

#14 楼 @xxqfamous 不是说 get 方法的 url 长度可以通过设置 nginx 的参数进行改变嘛?

get 方法有在不同浏览器有不同的长度,redirect 内置的不需要参考,设置 nginx 参数与应用服务器支持的大小无关

表单自动提交页面跳转肯定会有,跟重定向的区别在于,有提交数据,网速不佳时会明显些,更佳的屏蔽方法也有:当前请求由页面请求取数据,改成 ajax 请求拿数据,再构建表单 post 提交就只会看到页面切换一次了,这就要看适不适合你的场景了

#16 楼 @macknight 方法二。index 路径就把所有数据查出来而已。

回答这个问题让我很痛苦:

如何展示导入数据 <- 我认为问题在这里 ⬇ 如何把导入数据通过重定向传到 index <- 楼主看了我第一个回复后认为问题在这里 ⬇ 如何去掉 URL 长度限制 <- 楼主一开始认为问题在这里

如何展示导入数据

结果需要持久化吗?(用户是否可以重复访问同一结果) 需要,存数据库或缓存,重定向到某个地址,可以是 index,可以是 show,需要一个标识关联当前用户和结果。 不需要,直接 render 结果

如果需要持久化,要持久多久?(用户是否可以丢弃处理结果) 永久,存数据库。 有过期时间,存缓存,或周期性删除数据库内过期数据。

数据存服务器呗,给个 ID 跳转后再取回这个数据

#24 楼 @otinn 关键就是不想存数据库

#26 楼 @jicheng1014 cookie 就是爆掉了啊

需要 登录 后方可回复, 如果你还没有账号请 注册新账号