有条件重定向的最佳方法?
时间:2020-03-06 14:38:35 来源:igfitidea点击:
使用Rails v2.1,可以说我们对可从多个位置访问的控制器有一个操作。例如,在Rails应用程序中,我们具有一个链接,可从两个不同的视图编辑用户,一个视图位于用户索引视图,另一个视图则来自另一个视图(让我们在每个页面的导航栏中说)。
我想知道根据用户单击的链接将用户重定向回正确位置的最佳方法是什么。例如:
范例1:
- 列出所有用户
- 在列表中的用户上单击"编辑"
- 用户单击表单上的"保存",控制器将重定向回1.
范例2:
- 该用户可以在应用程序中的任何页面上,导航栏显示一个用于编辑当前用户的链接
- 用户单击链接进行编辑
- 用户单击表单上的"保存",当用户单击导航栏中的"编辑"链接时,控制器将重定向回到他们所在的页面。
我过去曾通过以下方式看到它:
- 在原始编辑链接上放置一个参数,并在其中显示链接的原始控制器/动作。要使它更干燥,可以在帮助器中使用@ controller.controller_name和@ controller.action_name。
- 控制器将参数保存到会话变量。
- 一旦控制器保存了记录,它将重定向到会话变量。
对于此解决方案,我特别不喜欢的是需要将参数添加到视图中的每个适用链接。我想知道是否有一种方法可以将所有这些都构建到控制器中。
我在想的一种更好的方法是:
- 将before_filter放在" edit"操作上,以将引荐来源网址(是否足够可靠?)保存到会话中。
- 当单击"更新"时,控制器将重定向到会话变量,然后删除该会话变量。
关于最佳方法的任何想法吗?
解决方案
我认为在edit动作上使用before_filter是最不麻烦的。
引荐来源网址应该足够可靠...如果没有可用的引荐来源,则只需设置默认值(例如:有人在编辑页面上添加了书签),就可以了。
Flash:仅用于下一个请求的数据可以存储在Flash中。然后,我们不必去自动清除它。它适用于有限的应用程序上下文环境,我们肯定只需要一次-而不仅仅是错误消息!
我知道我们上次进行HTTP访问时所做的操作:如果只需要将人们重定向到他们所处的最后一个URL,则只需执行此操作。对于大多数不阻止该信息的浏览器,request.referer将为我们提供该人员所在的最后一个URL。
#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开发人员都使用此工具作为他们最喜欢的锤子,并将其他所有东西变成钉子。当我们想向控制器中的所有或者几乎所有方法公开功能时,过滤器很有用。我不知道在这里确实是这种情况,但是里程可能会有所不同。如果有必要,我们可以将过滤器与以上两个技巧结合使用。