2008-09-24 26 views
6

使用Rails v2.1,可以说你有一个可以从多个位置访问的控制器的动作。例如,在Rails应用程序中,您有一个链接可以从两个不同的视图编辑用户,一个在用户索引视图中,另一个在另一个视图中(可以从每个页面上的导航栏中进行说明)。有条件重定向的最佳方式?

我想知道什么是最好的方式来重定向用户回到正确的位置,取决于他们点击了什么链接。例如:

例1:

  1. 名单列表中的
  2. 用户点击窗体上的“保存”用户的所有用户
  3. 点击“编辑”,控制器重定向回1 。

实施例2:

  1. 用户凑ld在应用程序中的任何页面上,导航栏显示编辑当前用户的链接
  2. 用户单击要编辑的链接
  3. 用户单击窗体上的“保存”,控制器重定向回任何页面他们在用户点击导航栏中的“编辑”链接时处于打开状态。

我已经看到了它在过去所做的:

  1. 与原来的控制器/动作,其中的链接出现在原来的编辑联系上放置一个参数。为了让这个更干,你可以在助手中使用@ controller.controller_name和@ controller.action_name。
  2. 控制器将参数保存到会话变量。
  3. 一旦控制器保存了记录,它就会重定向到会话变量。

我不特别喜欢这个解决方案是需要将参数添加到视图中的每个适用链接。我想知道是否有办法将这一切都构建到控制器中。我在想

一个更好的办法是:

  1. 广场上的“编辑”行动拯救引荐一个的before_filter(这是足够可靠?)到会话中。
  2. 当“更新”命中时,控制器将重定向到会话变量,然后删除会话变量。

有关最佳方式的任何想法?

回答

1

我认为在编辑动作上使用before_filter是最不显眼的。

引用者应该足够可靠......只要在没有引用者可用的情况下(默认情况下,有人将书签添加到编辑页面中),你应该没问题。

2

闪光灯:只用于下一个请求的数据可以存储在闪存中。那么你不必自动清理它。它适用于有限的应用程序上下文,你只需要一次 - 不仅仅是错误消息!

我知道你最后做了什么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开发者使用它作为他们最喜欢的锤子,并将其他所有东西变成钉子。当您想要向控制器中的所有或基本上所有方法公开功能时,过滤器非常有用。我不知道这一定是这种情况,但你的里程可能会有所不同。如果需要,您可以将过滤器与上述两种技巧结合使用。

+0

好的想法,你只是帮助我思考我正在看的一个不同的问题。谢谢! – 2008-09-24 19:33:52

0

另一种方法是加载表格,如http://flowplayer.org/tools/overlay/index.html,然后在ajax提交您可以关闭覆盖。我通过结合自动完成功能来提供“添加新”选项。一旦覆盖表单被提交,我就会返回一些json数据,这是用来填充自动填充的。 (我做了我自己的plugin以帮助所有这些)

它需要多一点工作,但它对于最终用户来说确实很好。

相关问题