有条件重定向的最佳方式?

时间:2008-09-24 04:50:43

标签: ruby-on-rails ruby model-view-controller redirect

使用Rails v2.1,假设您有一个可以从多个位置访问的控制器的操作。例如,在Rails应用程序中,您有一个链接可以从两个不同的视图编辑用户,一个在用户索引视图上,另一个在另一个视图中(比如每页的导航栏)。

我想知道根据用户点击的链接将用户重定向回正确位置的最佳方法是什么。例如:

示例1:

  1. 列出所有用户
  2. 点击列表中用户的“编辑”
  3. 用户点击表单上的“保存”,控制器会重定向回1。
  4. 示例2:

    1. 用户可以在应用程序中的任何页面上,导航栏显示编辑当前用户的链接
    2. 用户点击要修改的链接
    3. 用户点击表单上的“保存”,当用户点击导航栏中的“编辑”链接时,控制器会重定向回他们所在的页面。
    4. 我过去看过它:

      1. 使用出现链接的原始控制器/操作在原始编辑链接上放置参数。为了使它更干,你可以在帮助器中使用@ controller.controller_name和@ controller.action_name。
      2. 控制器将参数保存到会话变量。
      3. 控制器保存记录后,会重定向到会话变量。
      4. 我不太喜欢这个解决方案,需要将参数添加到视图中的每个适用链接。我想知道是否有办法将这一切都构建到控制器中。

        我想的一个更​​好的方法是:

        1. 在“编辑”操作上放置一个before_filter以保存引荐来源(这是否足够可靠?)到会话中。
        2. 当点击“更新”时,控制器将重定向到会话变量,然后删除会话变量。
        3. 有关最佳方法的任何想法吗?

3 个答案:

答案 0 :(得分:2)

Flash :您只能用于下一个请求的数据可以存储在闪存中。然后你不必自动清除它。它适用于有限的应用程序上下文,您肯定只需要一次 - 不仅仅是错误消息!

我知道您上次访问HTTP时的行为:如果您只需要将人员重定向到他们所在的最后一个网址,那么就这样做。对于大多数不阻止信息的浏览者,request.referer会给你这个人所在的最后一个网址。

#in edit controller
...
flash[:page_to_redirect_to] = request.referer || "/my/default/path"
...

#in save controller
redirect_to flash[:page_to_redirect_to] || "/my/default/path"

顺便说一句,我不建议硬编码。

before_filter :我看到很多Rails开发人员将此作为他们最喜欢的锤子并将其他所有内容变成钉子。当您希望向控制器中的所有或几乎所有方法公开功能时,过滤器非常有用。我不知道这是一定的情况,但你的里程可能会有所不同。如果有保证,您可以将过滤器与上述两个技巧结合起来。

答案 1 :(得分:1)

我认为在编辑动作中使用before_filter是最不突兀的。

引用者应该足够可靠...在没有引用者的情况下(例如:有人为编辑页面添加了书签),只需要一个默认值,你应该没问题。

答案 2 :(得分:0)

另一种方法是将表单加载到叠加层中,例如http://flowplayer.org/tools/overlay/index.html,然后在ajax提交上,您可以关闭叠加层。我与自动完成功能结合使用可提供“添加新”选项。一旦提交了覆盖表单,我就会在json中返回一些数据,这些数据被用来填充自动完成。 (我自己制作plugin来帮助解决所有问题)

它需要更多的工作,但它确实适用于最终用户。