【问题标题】:How to apply query parameter constraints to grape?如何将查询参数约束应用于葡萄?
【发布时间】:2018-05-25 07:42:40
【问题描述】:

在 Rails5 API 中,我能够将 Contraints 添加到路由中。例如;

GET /hello => hello#index
GET /hello?download => hello#download

如您所见,两个 URL 相同。唯一的区别是第二个有约束,如果下载参数在 URL 中,那么它会重定向到另一个动作。

我怎样才能在葡萄上做同样的事情?我在他们的文档和问题列表中找不到任何资源。

get :hello do
  'I am a hello world page'
end

但是如果 URL 有一些我预定义的查询参数,那么我想执行这个:

get :hello do { ?download }
  'download a file (for example)'
end

我使用params 并创建了一个requires 参数。 仍然是第一个捕获请求。

这是我在 Rails API 上使用的路由:

class DownloadConstraint
  def matches?(request)
    request.query_parameters.key?('download')
  end
end

更新:我想更清楚地说明这一点。我想同时使用这两条路线。我知道 params 包可用于在执行前要求参数。我想要实现的是我想根据 GET 参数设置路由。查看 Rails 的高级约束:http://guides.rubyonrails.org/routing.html#advanced-constraints

【问题讨论】:

    标签: ruby-on-rails ruby rack grape


    【解决方案1】:

    添加一个可选参数,如果收到则重定向:

    params do
      optional :download
    end
    
    get :hello do
      redirect '/' if params[:download]
    end
    

    【讨论】:

    • 谢谢。但这不起作用。看,这需要给出 :download 参数。但是如果我不写那个参数呢?我想将它们重定向到另一个动作。我想根据参数执行路由。我已经在我的问题中给出了约束样本。我想使用:hello withwithout 参数分开。如果我使用它,路线会说“下载”丢失,如果我没有把它放到 URL 中。见这里:guides.rubyonrails.org/routing.html#advanced-constraints
    • 对不起,我误解了你的问题。我会用一个可选的参数和一个重定向来处理它。
    • 没关系。我实际上不想进行 HTTP 重定向。我只想像在 Rails 中那样直接响应请求。我相信葡萄会有这个选择,但我不知道怎么做。如果 Rails 可以,grape 也可以(我猜)。或者也许有一种方法可以在内部将请求重定向到另一个方法/路由而不重定向用户的浏览器或请求。
    猜你喜欢
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多