我正在尝试实现一个类似于 GitHub 使用的“上下文”系统。例如,可以创建属于用户或用户所属的公司之一的帖子,具体取决于用户是在“用户”上下文中还是在引用公司之一的上下文中。
作为其中的一部分,我希望能够根据用户当前的上下文进行路由。例如,如果用户处于自己的上下文中,/dashboard
应该路由到users/show
,但如果它们位于 ID 为 35 的公司上下文中,则/dashboard
应该路由到companies/35/dashboard
.
我可以路由/dashboard
负责做出此类决定的特别控制者,例如context#dashboard
然后可以做一个redirect_to
,但这感觉不太正确(也许是因为我们正在采用 Rails 路由模块应该负责的逻辑并将其移动到控制器?)
在 Rails 3 中解决这个问题的正确方法是什么?
我终于找到了我喜欢的问题的解决方案。这将使用我原来问题中的 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
Now, 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。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)