【问题标题】:Redirecting to the same controller method in Rails在 Rails 中重定向到相同的控制器方法
【发布时间】:2023-09-07 11:57:01
【问题描述】:

假设,有一个标准的 books_controller,我需要在其中修改索引方法。如果 params[:value] 为 nil,我需要为其分配 not_nil 值,然后重新加载同一页面。我在 index 方法中所做的是

redirect = params[:value].nil?
params[:value] ||= some_value_which_is_not_nil
redirect_to books_path if redirect

问题是重定向后 params[:value] 再次为零!如何将 params 变量传递给 redirect_to 方法,或者有没有其他方法来存储这个值?

【问题讨论】:

  • 您不必重定向到同一页面。控制器操作将在页面实际呈现之前完成,因此在第一个请求中设置变量就足够了。

标签: ruby-on-rails controller params


【解决方案1】:

params 哈希不能这样工作。 HTTP 是无状态的 - 分配不会在请求之间持续存在。

这意味着,每次发出请求时,都会从请求中的 GET/POST 参数填充 params 哈希。如果您想重定向到同一页面并保留该参数,则必须将其作为 GET 参数传递。

redirect_to books_path(:value => some_value_which_is_not_nil) if redirect

【讨论】:

  • 那么解决方案是什么?实例变量?
  • 不,跨请求持久化数据是通过 cookie 或某些服务器端后备存储完成的。在这种情况下,您可以简单地将值作为参数添加到请求中。但是,将来您会发现自己希望将整个对象从请求传递到请求。这变得一团糟。您可以将对象存储在未加密的 cookie(4KB 限制)中,或者将用户的会话绑定到数据库、内存缓存或其他一些后备存储。
  • 为了进一步澄清,请考虑这样一个事实,即对您的应用程序的两个连续请求很可能由您的应用程序的两个完全独立的运行实例处理。
【解决方案2】:

我不确定这是否是您要查找的内容,但您可以将参数传递给 path 方法。

books_path(:value => 1) 产生/books?value=1

【讨论】:

    【解决方案3】:
    def index
     ## RELOAD same page if params value is nil
     params[:value] || redirect_to books_path(:value => "some_value_which_is_not_nil")
     # Do my own processing!
    end
    

    【讨论】:

      【解决方案4】:

      如果您将 nil 值设置为某个值,它应该与您要重新加载的操作相同......为什么不继续使用您设置的值而不重新加载?

      我看不出你需要重新加载动作。

      【讨论】: