Rails 3基于上下文进行路由

时间:2010-09-26 21:05:29

标签: ruby-on-rails-3 routing contextpath

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

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

我可以将companies/35/dashboard路由到负责做出此类决定的特殊控制器,例如/dashboard然后可以执行context#dashboard,但这感觉不太正确(也许是因为我们采用Rails路由模块负责并将其移动到控制器的逻辑?)

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

2 个答案:

答案 0 :(得分:2)

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

首先,假设会话存储的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

现在,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

很容易保留重定向的实际URL(在routes.rb文件中!),并将数据传递给DRY控制器。我甚至可以传递路径中当前上下文对象的ID。

答案 1 :(得分:0)

您的方法对我来说似乎是最好的方法。任何其他东西都会更混乱,而且不是很标准。