【问题标题】:How to get current URL in Ruby/Rails in my plugin's module?如何在我的插件模块中获取 Ruby/Rails 中的当前 URL?
【发布时间】:2011-03-30 19:02:34
【问题描述】:

我需要在我的插件模块中获取 url 信息。

request.request_uri 不可用。

是否有 ruby​​/rails 类似于 $_SERVER['REQUEST_URI'] 的 php?

例如:

module MyPlugin
  module Routing
    def self.getOpts
      # HIRE I NEED TO ANALYZE URL and return hash with resulting param
      return {controller: :divisions, action: :show, id: 11, as: :current}
    end
  end
end

# extend routing
module ActionDispatch::Routing
  class Mapper
    def my_rout
      match 'articles', MyPlugin::Routing.getOpts
    end
  end
end

# In config/routes.rb
Rails::application.routes.draw do
  my_rout
end

这就是我所需要的,例如:

  1. 我们得到一个网址http://mysite.ru/slug_division_1/slug_division_2
  2. ID 为 2 的部门在 DB 表中有一个字段“handler”,值为“any_controller#any_action”
  3. 在 MyPlugin::Routing 中,我正在分析 url 路径并从 DB 中获取值 'any_controller#any_action'
  4. MyPlugin::Routing.getOpts 返回参数 {controller::any_controller, action::any_action, id: 2, as::current}
  5. 从 ActionDispatch::Routing.Mapper.my_rout 我们像这样设置新的 rout

    匹配'slug_division_1/slug_division_2',{控制器::any_controller,动作::any_action,id:2,as::当前}

只是一个小技巧。

【问题讨论】:

  • 说什么?您想要rubyphp 中的答案吗?
  • 我试图通过比较 ruby​​ 和 php 来理解主题
  • 你能解释一下你想用显示的代码实现什么吗?就像@daemin 我觉得你做错了。

标签: ruby-on-rails url routing request


【解决方案1】:

如何使request_uri成为rails中的全局变量?

1) 使用以下代码添加到文件夹 'vendor/plugins/myplugin/lib/myplugin' 文件 request_global.rb

module Rack
  class MethodOverrideWithParams < Rack::MethodOverride
    def call(env)
        $request = Rack::Request.new(env) # $request is global vriable
        super(env)
    end
  end
end

2) 在vendor/plugins/myplugin/lib/myplugin.rb 中添加:

require 'myplugin/request_global'

3) 在config/application.rb 添加:

config.middleware.swap 'Rack::MethodOverride', 'Rack::MethodOverrideWithParams'

4) 瞧,$request 现在可以从 Rails 应用程序的任何位置访问!

在我的情况下它是没用的,因为每次为每个$request 进行数据库查询以获取处理程序都需要重新加载路由 (Rails::Application.reload_routes!)。它会降低性能。定义所有可能的路线更有利可图,即使这些路线有几千条。仅当有人编辑了分区时才会重新加载路线。

【讨论】:

  • 全局变量也不受欢迎。
【解决方案2】:

是的,尝试使用request.request_uri

【讨论】:

    【解决方案3】:

    request.request_uri 是查找所需信息的方法。如果您无权访问它,那么您需要向您的函数添加一个参数并从某个可以访问的地方调用它。

    从内存控制器确实可以访问 request_uri。


    我认为您真正想要的只是表中的一个控制器/动作路由,它接受任何路径,并在控制器动作中进行查找并调用相关函数。检查路径通配符(使用 Rails 2.3 中的“*”字符,不确定您是否使用 Rails 3),看看这是否适合您正在做的事情。

    然后您将拥有一条需要很长路径的单一路由,控制器和动作将这条路径分成自己的部分,执行查找,并调用适当的函数(或其他控制器/动作)。

    但是,对于我认为您做错的一些事情,我不得不说几句话。

    除非您正在做一些非常棘手且非常不同寻常的事情,否则不要将控制器和操作存储在数据库中。这就是红宝石路线本身的意义所在。如果您需要将这些存储在数据库中,那么在我看来您做错了。

    您不应该将 id 号硬编码到路由中,让它成为一个被设置的变量。所以不要硬编码 /some/thing/23 来匹配 'some/thing/23',而是让路由匹配 'some/thing/:id',你会自动得到 :id => 23。

    【讨论】:

    • 怎么做?我尝试扩展 ActionController::Base 但不起作用
    • 看着你那里的代码,我觉得“你做错了”很有趣。在我看来,您正在尝试创建自己的路由机制,而 Rails 中已经有合适的路由机制了。
    • 如果使用 '*' 那么将是一个带有重定向的单一路由,这是不合适的。
    • 关于你认为我做错的事情。问题不在于什么是对什么是错。我明白我愿意。我有一个必须解决的问题。
    • Rails 如何使用 url,它使用哪些类?我有第二天试图弄清楚是什么:(
    猜你喜欢
    • 2014-02-21
    • 2011-01-11
    • 2015-05-02
    • 2019-09-04
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    相关资源
    最近更新 更多