Rails controller 之间如何传递参数

carl · 2012年02月09日 · 最后由 kevinli 回复于 2016年12月15日 · 9725 次阅读

在一个 controller 中做处理,当出现某一条件时,转到另一个页面,我用了 redirect_to 进行跳转,我用:id=>'example', 传递参数,但是这个参数我不想让他出现在地址栏中,只想让另一个 controller 得到它,请问大家应该怎么做? 谢谢!

用 session,虽然 session 很容易被用烂

@ywencn 可以简单的举个例子吗?

数据库,Cache,用 URL 参数都可以的啊

@huacnlee URL 参数?用 redirect_to 怎么做,可以让他不出现在地址栏的 url 里,只让 controller 接收到?

#4 楼 @carl 如果用 URL 参数,又要看不到,这是不可能的。即使用 POST 的方式,也只是在地址上看不出来,但是数据还是可见的(用调试工具可以看到)。

@sunzheng91 嗯,那用 session 应该可以的吧?

#5 楼 @sunzheng91 session 可以,但是不要存太多。session 记录会一直在的,占用服务器空间。最好在访问后把 session 中相应的健值清除。

重定向 就必然在地址栏能看到。你期待的又要 redirect 又要 post 是无法实现的。 这个 HTTP 协议上就不支持 所以你放 session 看起来是相对比较简单的 :)

@poshboytl , @sunzheng91 嗯好的,谢谢!

#4 楼 @carl 那就 POST 请求过去。

#11 楼 @huacnlee 不行,你在 controller 里怎么 post 过去?

#12 楼 @poshboytl 哦,我搞晕了...

试试 iframe。

在第一个 controller 处理后,生成的 views 包含 iframe,这个 iframe 的地址(包括了 id=>'example'的参数)去请求第二个 controller,这样就不会出现在地址栏了。

但是 iframe 内部的所有链接和表单的 target,都必须是 _top,要不然地址栏就不会变了。

上面有人说了,用 session 或 cookies 来处理:

session[:hash] = {:name => 'ruby', :type => 'lang'} 或者 cookies.signed[:hash] = {...}

这样你 redirect 之后,就可以在下一个 controller 中使用 session[:hash] 或 cookies.signed[:hash] 把那个 hash 调出来。

原理就是 rails 会把那个 hash 用 marshal 做个序列化和签名,放到 cookie 里面。所以其实你将一个 model 的 obj 塞到里面都是可以的,我用过的一个地方就是 new resource 验证失败后,把包含 error 的 model obj 塞到 cookie 里,还是跳转 resource/new 页面,这样就避免了 scaffold 那种验证失败后留在/resources/页面的情况。

全局变量

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