【问题标题】:Ruby on Rails: How to assign a hard value to a variable?Ruby on Rails:如何为变量分配硬值?
【发布时间】:2012-07-08 18:30:12
【问题描述】:

我正在使用多个重定向,我想从 A->B->C->A 重定向。

所以在 B 中,我将路径 A 保存为

@previouspage = request.referer

此时@previouspage = A,但是当我在C中调用@previouspage时,并没有带来B中保存的硬值,而是找到了自己的相对request.referer,也就是B。

所以在 C 中,@previouspage = B(因为我认为 Ruby 中的变量是软链接)

我将如何保存 request.referer 在 B 点的值,然后将该 URL 保存到我以后可以访问的变量中?

【问题讨论】:

  • 您不认为将值保存在会话中会更好吗?
  • @VincentPaca 将其保存在会话中并不能阻止存储的值更改.. :( 请参阅下面的要点

标签: ruby ruby-on-rails-3 variables routing variable-assignment


【解决方案1】:

HTTP 是一种无状态协议:请求之间不会记住变量。如果要在请求之间保存状态,则可以使用会话。在 Rails 中是这样完成的:

在 B 中:

session[:page_a] = request.referer

在 C 中:

@next_page = session[:page_a]

Rails Security Guide 以会话及其漏洞开头。您可能想检查一下。

【讨论】:

  • 我试过这个,但是“@next_page”仍然试图找到它自己的request.referer,恰好是B。我用puts来查看变量的值是什么,在B , session[:page_a] 存储我需要的(A),但@next_page 将值更改为 B,而不是 A。
  • 这里是显示 session[:page_a] 在用户登录后发生变化的要点和日志。gist.github.com/3076131
  • 我的猜测是你也在 C 中分配 session[:page_a]
【解决方案2】:

Rails 变量不会在请求之间保留。如果你想保存一些数据,你应该:

  • 将其保存在(会话)cookie 中
  • 保存在数据库中
  • 从袖子里拿出一些技巧,并将引用者作为参数或类似的东西传递,但根本不建议这样做。

【讨论】:

    【解决方案3】:

    完成这项工作需要三件事

    • 使用会话:sessions[:original_page]=request.referrer
    • 考虑到会话在登录后刷新(检查是否为零)
    • 记得在控制器中使用 session[:original_page]=nil 后立即设置。

    【讨论】:

    • 顺便说一句,你的完整代码在 github 上吗?自己运行它可能会更容易。想在纸上做到这一点,我头晕目眩!
    • 完整代码在私有仓库中;没有完整的代码是不是太难了?
    • 哦,不用担心。在过滤器之前,我很难弄清楚 store_location 正在执行哪些操作。任务控制器下的所有操作是什么?
    • gist.github.com/3077397 这是missions_controller 的完整文件:)。我认为您可能是对的,因为它刷新了会话,因为我基本上是在告诉 after_sign_in_path 执行一个操作,该操作将调用 before_filter :store_location。
    • 您在 MissionsController 外过滤之前是否使用了“store_location”?顺便说一句,您是否考虑过要求用户“登录投票”?不要有意干涉您的设计决策!只是好奇。即使它不是 before_filter,我也不确定您是否可以保留用户登录会话之前的路径
    猜你喜欢
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 2012-09-24
    • 2013-02-21
    • 1970-01-01
    • 2013-04-13
    • 2016-02-10
    相关资源
    最近更新 更多