代码之家  ›  专栏  ›  技术社区  ›  Michelle Tilley

基于上下文的Rails3路由

  •  5
  • Michelle Tilley  · 技术社区  · 14 年前

    我试图实现一个类似于Github使用的“上下文”系统。例如,可以创建属于用户或用户所属公司之一的日志,具体取决于“用户”上下文还是指其中一家公司的上下文。

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

    我可以路由 仪表板 向负责作出此类决定的特别控制员,如 context#dashboard 这样就可以 redirect_to 但这感觉不太正确(可能是因为我们采用了Rails路由模块应该负责的逻辑,并将其移动到控制器?)

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

    2 回复  |  直到 9 年前
        1
  •  2
  •   Michelle Tilley    14 年前

    我终于找到了我喜欢的解决问题的方法。这将使用原始问题的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
    

    现在, 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 文件!)这些数据被传送到一个干控制器。我甚至可以传递路由中当前上下文对象的ID。

        2
  •  0
  •   Bo Jeanes    14 年前

    你的方法对我来说似乎是最好的方法。其他的东西都会比较杂乱,不太标准。

    推荐文章