6

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

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

示例 1:

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

示例 2:

  1. 用户可以在应用程序的任何页面上,导航栏显示编辑当前用户的链接
  2. 用户点击链接进行编辑
  3. 用户单击表单上的“保存”,当用户单击导航栏中的“编辑”链接时,控制器将重定向回他们所在的任何页面。

我在过去看到它是通过以下方式完成的:

  1. 将参数放置在原始编辑链接上,并带有链接出现的原始控制器/动作。为了使这更干燥,您可以在帮助程序中使用@controller.controller_name 和@controller.action_name。
  2. 控制器将参数保存到会话变量中。
  3. 一旦控制器保存了记录,它就会重定向到会话变量。

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

我想的一种更好的方法是:

  1. 在“编辑”操作上放置一个 before_filter 以将引用者(这是否足够可靠?)保存到会话中。
  2. 当点击“更新”时,控制器将重定向到会话变量,然后删除会话变量。

对最好的方法有什么想法吗?

4

3 回答 3

2

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

于 2008-09-24T08:15:35.853 回答
1

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

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

于 2008-09-24T05:02:08.003 回答
0

另一种方法是在叠加层中加载表单,例如http://flowplayer.org/tools/overlay/index.html,然后在 ajax 提交时关闭叠加层。我结合自动完成来提供“添加新”选项。提交覆盖表单后,我会以 json 格式返回一些数据,用于填充自动完成。(我制作了自己的插件来帮助解决所有这些问题)

这需要更多的工作,但它确实对最终用户很有效。

于 2011-01-02T15:15:34.967 回答