Rails 3基于上下文进行路由

Mic*_*ley 5 routing ruby-on-rails-3 contextpath

我正在尝试实现类似于GitHub使用的"上下文"系统.例如,可以创建属于用户或用户所属的公司之一的帖子,这取决于用户是在"用户"上下文中还是在引用其中一个公司的上下文中.

作为其中的一部分,我希望能够根据用户的当前上下文进行路由.例如,如果用户在他们自己的上下文中,/dashboard应该路由到users/show,但如果他们在ID为35的公司的上下文中,则/dashboard应该路由到companies/35/dashboard.

我可以路由/dashboard到一个负责做出这样决定的特殊控制器,比如context#dashboard可以做一个redirect_to,但这感觉不太正确(也许是因为我们正在采用Rails路由模块负责的逻辑并将其移动到控制器?)

在Rails 3中解决这个问题的正确方法是什么?

Mic*_*ley 2

我终于找到了我喜欢的问题的解决方案。这将使用我原来问题中的 URL。

首先,假设一个会话存储Context对象存储用户是处于“用户”上下文还是“公司”上下文中。如果用户位于“公司”上下文中,那么他们正在工作的公司的 ID 也在对象中。我们可以通过名为的帮助程序获取上下文get_context,并且可以通过获取当前登录的用户current_user

现在,我们如下设置路线:

config/routes.rb:

MyApplication::Application.routes.draw do
  get "dashboard" => "redirect", :user => "/users/show", :company => "/companies/:id/dashboard"
end
Run Code Online (Sandbox Code Playgroud)

现在,app/controllers/redirect_controller.rb

class RedirectController < ApplicationController
  def method_missing(method, *args)
    user_url    = params[:user]
    company_url = params[:company]
    context     = get_context

    case context.type
    when :user
      redirect_to user_url.gsub(":id", current_user.id.to_s)
    when :company
      redirect_to company_url.gsub(":id", context.id.to_s)
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

将重定向的实际 URL 保留在它们所属的位置(在文件中routes.rb!)并且数据被传递到 DRY 控制器是很容易的。我什至可以在路由中传入当前上下文对象的 ID。