【问题标题】:Rails 3 routing based on contextRails 3 基于上下文的路由
【发布时间】:2011-04-17 12:31:20
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我知道您对将仪表板控制器作为伪路由器选项感觉不妥,但是让路由器从 cookie/params 传递的信息中读取上下文/会话模型似乎也很奇怪。跨度>

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


【解决方案1】:

我终于找到了我喜欢的问题的解决方案。这将使用我原始问题中的 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 文件中!)并且该数据被传递到 DRY 控制器是很容易的。我什至可以在路由中传入当前上下文对象的 ID。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 看来这应该是一条评论。
    猜你喜欢
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    相关资源
    最近更新 更多