Rails 3 - 如何使用所有选项和参数进行重定向?

Rails 3 - How to redirect with all options and parameters?

假设我为 Foo 控制器创建了一堆路由:

/foos
/foos/1
/foos/1/posts

等等

现在我创建一个 Bar,它是 Foo 的 子类型。我不想让 Foo urls 可以访问 Bars 来混淆用户,所以我为 Bars 创建了重复的路径。

/bars (goes to Foo controller)
/bars/1 (goes to Foo controller)
/bars/1/posts (goes to Posts controller)

一切正常。问题是我在我的应用程序中的每个地方都使用了名称路由,比如

def update
  # bla bla bla
  redirect_to foo_path(@foo)
end

这将使用户编辑栏从 /bar/1/edit/foo/1。我怎样才能成功地将它们重定向或发送到正确的 urls?

我尝试在我的 ApplicationController 中执行此操作,它适用于 GET 请求,但没有别的:

def ensure_correct_path
  if current_foo_is_type_bar && request.path =~ /^\/foo/
    redirect_to request.path.sub(/^\/foo/, /^\/bar/)
  end
end

不幸的是,用户发布的内容(以及它是什么 HTTP 方法)等参数不会传递给新 url。有什么方法可以快速轻松地解决这个问题(我不介意有点老套)?

如果 Foo 和 Bar 也是模型,或者您以某种方式在这些操作中将 "Foo" 和 "Bar" 作为字符串访问,您可以使用 polymorphic_path:

polymorphic_path(@thing.class.downcase)
polymorphic_path("Foo".downcase)
polymorphic_path([:show, @thing.class.downcase, @thing.id])

等...