【问题标题】:Setting up Rails routes based on QueryString基于 QueryString 设置 Rails 路由
【发布时间】:2011-06-20 18:29:09
【问题描述】:

我已经看到了类似的问题,但不是我要找的... 暂时忘记了这样做的智慧,这样做可能吗?...

/object/update/123?o=section    # ==> route to SectionController#update
/object/update/456?o=question   # ==> route to QuestionController#update

...如果是这样,该怎么做?

【问题讨论】:

  • 在这种情况下,我只在控制器中看到 redirect_ti 选项

标签: ruby-on-rails routes query-string


【解决方案1】:

抛开这样做是否明智的问题,“这可能吗”的答案是“是”:

class QueryControllerApp
  def self.call(env)
    controller_name = env['QUERY_STRING'].split('=').last
    controller = (controller_name.titleize.pluralize + "Controller").constantize
    controller.action(:update).call(env)
  rescue NameError
    raise "#{controller_name} is an invalid parameter"
  end
end

MyRailsApp::Application.routes.draw do
  put 'posts/update/:id' =>  QueryControllerApp
end

基本上,路由映射器可以接受任何 Rack 应用程序作为端点。我们的简单应用程序解析查询字符串,构建控制器名称并调用 ActionController 方法action(它本身就是一个 Rack 应用程序)。未展示:如何处理除'o=<controller_name>'以外的任何格式的查询字符串

【讨论】:

  • 据我所知,这是“重定向”的唯一方法,不会产生删除查询字符串的副作用。谢谢@zetetic
  • 我会使用:Rack::Utils.parse_nested_query(env["QUERY_STRING"]),而不是 .split
【解决方案2】:

假设您使用的是 Rails 3+,您可以使用“高级约束”(在 http://guides.rubyonrails.org/routing.html#advanced-constraints 上了解更多信息)。

以下是解决示例的方法:

module SectionConstraint
  extend self

  def matches?(request)
    request.query_parameters["o"] == "section"
  end
end

module QuestionConstraint
  extend self

  def matches?(request)
    request.query_parameters["o"] == "question"
  end
end

Rails.application.routes.draw do
  match "/object/update/:id" => "section#update", :constraints => SectionConstraint
  match "/object/update/:id" => "question#update", :constraints => QuestionConstraint
end

【讨论】:

  • 这个模块应该写在哪里,在哪个文件夹中?我是 RoR 的新手。
【解决方案3】:

@moonmaster9000 仅针对routes.rb 的回答更简洁:

match "/object/update/:id" => "section#update", 
  :constraints => lambda { |request| request.params[:o] == "section" }
match "/object/update/:id" => "question#update", 
  :constraints => lambda { |request| request.params[:o] == "question" }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-27
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 2011-04-17
    • 1970-01-01
    相关资源
    最近更新 更多