【问题标题】:Rails access request in routes.rb for dynamic routes动态路由的 routes.rb 中的 Rails 访问请求
【发布时间】:2014-03-18 07:16:44
【问题描述】:

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

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

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

f.e.像这样

routes.rb

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

app/models/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 中未定义

【问题讨论】:

  • 那么,基本上,你想支持每条路线?
  • 我想为每个网站设置动态路由.. f.e.如果对于我们的一个站点,我想调用 /category/:id 而对于另一个站点,它应该是 /category/:slug 如果我可以将请求对象从 routes.rb 传递到模型方法中,它应该能够做到这一点, 我已经知道我能做剩下的事了
  • /category/:id 和 /category/:slug 是同一条路线。唯一的区别是,第一个动态部分将存储在 params[:id] 中,第二个是 params[:slug]
  • 是的,当然.. 但想象一下你有 www.site1.com 和 www.site2.com ...两者都来自一个代码库 .... 在 routes.rb 我想从中找出请求来自哪个站点并为此站点提供正确的路由
  • 那么,根据域,您想使用不同的控制器吗?

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-20
      • 2021-10-05
      • 1970-01-01
      • 1970-01-01
      • 2020-09-28
      相关资源
      最近更新 更多