【问题标题】:Query string in route.rbroute.rb 中的查询字符串
【发布时间】:2018-12-07 16:15:36
【问题描述】:

我想在我的路由中添加另一个显式查询参数。

现在,我有这个:

Rails.application.routes.draw do
  scope :format => true, :constraints => {:format => :json} do
    get     'proxies/random(?type=:proxy_type)'   => 'proxies#random'

我想做的是再添加一个(?origin=:origin) 查询参数。 我只是找不到任何文档或示例。

我相信我应该有这样的东西:

Rails.application.routes.draw do
  scope :format => true, :constraints => {:format => :json} do
    get     'proxies/random(?type=:proxy_type&origin=:origin)'   => 'proxies#random'

或者这个:

Rails.application.routes.draw do
  scope :format => true, :constraints => {:format => :json} do
    get     'proxies/random(?type=:proxy_type)(?origin=:origin)'   => 'proxies#random'

这样做的正确方法是什么?

顺便说一句,这是我在控制器中所做的:

  [...] 
  before_filter :find_randomly, only: :random
  [...]

  def find_randomly
    if params[:origin].nil? or params[:origin].blank?
      relation = ProxiesCatalogueProxy.where(blacklisted: false)
    else
      relation = ProxiesCatalogueProxy.where(blacklisted: false, origin: params[:origin])
    end

    @proxy = if params[:type].nil? or params[:type].blank?
              relation.order("RAND()").first
            else
              relation.where(proxy_type: params[:type]).order("RAND()").first
            end

  end

另外,有人可以提供关于这个主题的任何好的资源/材料吗? 谢谢。

【问题讨论】:

  • 对于查询字符串,你不需要编写路由定义。无论你传递什么都是available in the params。您当然可以使用permit 方法将不需要的查询字符串参数列入黑名单。
  • 有点像XY Problem。你想做什么?
  • @ArupRakshit 假设我没有为类型和来源添加显式声明......如果我只是点击路线“代理/随机”(无参数)不会引发某种异常吗?因为,在控制器中我已经有如下语句:“if params[:origin].nil? or params[:origin].blank?”和“如果 params[:type].nil? 或 params[:type].blank?”期望来源和类型参数。

标签: ruby-on-rails ruby api routes


【解决方案1】:

如果您想将参数硬编码到您的路线中,您可以执行以下操作:

get 'proxies/random(?type=:proxy_type)' => 'proxies#random', origin: 'some value'

这不会影响 URL 匹配,并且会将来源添加到相应控制器中可访问的参数哈希中,并将操作作为 params[:origin]

【讨论】:

  • 不错!谢谢!差不多了!我想要一个可以被覆盖的默认值,所以如果我得到一个明确包含原始参数的路由,例如“/proxies/random.json?origin=other”,我想获得原始参数的“其他”值,而不是默认值。
  • 哦,好吧,那么您不想为此使用路由。做你想做的最好的方法是在你的 ApplicationController 中添加一个“before_action”方法,每个请求都会调用它。该操作应检查 params[:origin].blank?并相应地重定向。
猜你喜欢
  • 2019-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多