用于动态路由的routes.rb中的Rails访问请求

我们的网站应该允许显示与给定url相关的不同内容..类似于wordpress中的多字节,我们有一个安装,并根据url提供内容。

因为有必要使用正确的语言,我想使用“动态路线”方法来提供正确的内容。 我现在的问题是,如果它们是动态的,我找不到如何在routes.rb中提供正确路由的方法。

如何将请求对象 “访问”或“传递”到routes.rb文件中的任何方法

我喜欢这个

的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中未定义请求

可能的解决方案是在routes.rb上创建默认规则,并添加可根据域转换路径的机架中间件

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

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

有关机架中间件的更多信息: http : //guides.rubyonrails.org/rails_on_rack.html

回答你的问题:我如何“访问”或“传递”请求对象到routes.rb文件中的任何方法。从机架中间件获取它作为ENV对象。参见下面的代码

 # 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 

在路线中再次抓住它

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