Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 基于上下文的Rails 3路由_Ruby On Rails 3_Routing_Contextpath - Fatal编程技术网

Ruby on rails 3 基于上下文的Rails 3路由

Ruby on rails 3 基于上下文的Rails 3路由,ruby-on-rails-3,routing,contextpath,Ruby On Rails 3,Routing,Contextpath,我正在尝试实现一个类似于GitHub使用的“上下文”系统。例如,可以创建属于该用户或该用户所属的公司之一的帖子,这取决于该用户是在“用户”上下文中还是在引用其中一家公司的上下文中 作为其中的一部分,我希望能够基于用户的当前上下文进行路由。例如,如果用户在自己的上下文中,/dashboard应该路由到用户/show,但是如果他们在ID为35的公司上下文中,那么/dashboard应该路由到公司/35/dashboard 我可以将/dashboard路由到负责做出此类决策的特殊控制器,例如上下文#d

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

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

我可以将
/dashboard
路由到负责做出此类决策的特殊控制器,例如
上下文#dashboard
,然后该控制器可以将
重定向到
,但这感觉不太正确(可能是因为我们采用了Rails路由模块应该负责并将其移动到控制器的逻辑?)


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

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

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

首先,假设一个session-stored
Context
对象存储用户是在“用户”上下文还是在“公司”上下文中。如果用户处于“公司”上下文中,那么他们正在工作的公司的ID也在对象中。我们可以通过名为
get\u context
的助手获取上下文,也可以通过
current\u user
获取当前登录的用户

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

config/routes.rb

MyApplication::Application.routes.draw do
  get "dashboard" => "redirect", :user => "/users/show", :company => "/companies/:id/dashboard"
end
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
现在,
app/controllers/redirect\u controller.rb

MyApplication::Application.routes.draw do
  get "dashboard" => "redirect", :user => "/users/show", :company => "/companies/:id/dashboard"
end
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。

我知道您觉得仪表板控制器作为伪路由器选项不合适,但让路由器从Cookie/params传递的信息中读取上下文/会话模型似乎也很奇怪。似乎这应该是一个注释。