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

时间:2014-02-18 13:31:54

标签: ruby ruby-on-rails-3 ruby-on-rails-4 routes

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

因为有必要使用正确语言的路线我想使用“动态路线”方法来提供正确的内容。我现在的问题是,如果它们是动态的,我找不到如何在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中未定义请求

2 个答案:

答案 0 :(得分:3)

回答你的问题:我如何“访问”或“传递”请求对象到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

答案 1 :(得分:1)

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

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

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

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