2014-02-18 185 views
2

我们的网站应该允许显示与给定的网址有关的不同内容..就像在wordpress中的多站点,我们有一个安装和根据url提供内容。Rails路由请求routes.rb动态路由

由于需要以正确的语言显示路线,我想使用“动态路线”方式来提供正确的内容。我的问题是,现在我没有找到一个方法如何在routes.rb中服务正确的路由,如果它们是动态的。

我如何“访问”或“关” 请求对象到的routes.rb文件

F.E.内的任何方法这样

的routes.rb

Frontend::Application.routes.draw do 
    DynamicRouter.load request 
    end 

应用程序/模型/ dynamic_router.rb

class DynamicRouter 
    def self.load request 
    current_site = Site.find_by_host(request.host) 
    Frontend::Application.routes.draw do 
     current_site.routes do |route| 
     get "#{route.match}", to: "#{route.to}" 
     end 
    end 
    end 
end 

这并不工作,因为请求在routes.rb中

+0

所以,基本上,你要支持所有的路线再次

# lib/dynamicrouterrequest.rb require 'rack' class DynamicRouterRequest def initialize(app) @app = app end def call(env) request=Rack::Request.new(env) ENV["OBJ_REQUEST"]=request.inspect.to_s @app.call(env) end end 

抓住它的代码? –

+0

我想有每个网站的动态路线.. f.e.如果对于我们的某个网站,我想要调用/ category /:id,对于另一个网站,应该是/ category /:slug它应该能够做到这一点 如果我只是将请求对象从routes.rb传递到模型方法,我已经知道我可以怎样做其余 – Mik

+0

/category /:id和/ category /:slug是相同的路线。唯一的区别是,第一个动态部分将被存储在params [:id]中,第二个是params [:slug] –

回答

1

不确定的可能soluction是在routes.rb上创建默认规则并添加可根据域名转换路径的机架中间件

# routes.rb 
get '/category/:id', :to => 'categories#show' 

在应用程序击中路由器层之前,在中间件中,如果域匹配'.es',则可以将类似'categoria /:id'的路径转换为'/ category /:id'。

更多关于机架中间件:http://guides.rubyonrails.org/rails_on_rack.html

2

要回答你的问题:我如何才能“访问”或“通过”请求对象到任何方法的routes.rb文件中获取它从机架中间件ENV对象。请参见下面的路线

# routes.rb 
Frontend::Application.routes.draw do 
    request=ENV["OBJ_REQUEST"] 
    DynamicRouter.load request 
end