【问题标题】:Rails Routes: Programmatically extract params from a URLRails Routes:以编程方式从 URL 中提取参数
【发布时间】:2015-03-05 07:37:53
【问题描述】:

我需要以编程方式从 URL 中提取参数,即如果调用 URL,控制器将接收到的哈希值。这不是在控制器内部发生的,而是用于自省工具,因此控制器永远不会运行。我想预测如果控制器运行会发生什么,希望使用 Rails 本身正在使用的相同 API。

例如,给定 Rails 路由 /blogs/:id 和 URL 查询 /blogs/123?published=true,我想提取 { id: 123, published: true }

使用Rails.application.routes.recognize_path,我可以在此示例中获得id,因为它是路由模式的一部分,但不是额外的CGI 参数(published)。我可以手动添加这些,但我想知道是否有合适的 API。

【问题讨论】:

  • 你没有在一个动作中得到所有这些params 吗?
  • 不,我知道参数的基本知识,但这需要以编程方式完成。更新了问题以澄清这一点。
  • 基于您对以下答案的评论?您是否希望将其作为机架应用程序运行?它需要坐在控制器前面吗?它会在生产中运行吗?还是更多地模拟/收集有关该应用程序的元数据?
  • 只是收集元数据。它主要用于批处理控制器,它允许调用者将一堆调用复用在一起。

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


【解决方案1】:

您可以解析 URL,读取查询字符串并将它们转换为哈希。

u = URI.parse("http://localhost:3000/blogs/213?published=true")
cgi_params = u.query.split('&').map { |e| e.split('=') }.to_h

将它们与您使用Rails.application.routes.recognize_path 获得的params 合并

【讨论】:

    【解决方案2】:

    params Hash 包含所有路由参数,包括查询参数。

    # Given /blogs/123?published=true
    def action
      params[:id] # => 123
      params[:published] # => "true"
    end
    

    【讨论】:

    • 谢谢,但我正在寻找一个实际上并未运行控制器的自省工具。
    猜你喜欢
    • 1970-01-01
    • 2016-08-08
    • 2011-10-26
    • 1970-01-01
    • 2017-01-19
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    相关资源
    最近更新 更多