Rails - 从命名路由中提取HTTP谓词

时间:2013-12-31 05:46:30

标签: ruby-on-rails ruby

Rails中有没有办法提取与路由关联的HTTP谓词?例如,给定这样的路线:

match 'users', to: 'users#show', via: [:get, :post]

我能实现这样的目标吗?

users_path.respond_to?(:get)(显然#respond_to不是正确的方法)

我最接近的是通过以下方式来做,但看起来并不令人满意。

Rails.application.routes.routes.named_routes["users"].constraints[:request_method] # => /^GET$/

对于上下文,我有一个设置cookie然后执行redirect_to :back的操作,但此操作在整个站点中全局可用(位于页脚中)。因此,如果用户恰好在流中,并且其中一条路由只接受POST,则重定向失败,因为发出的请求是GET。

谢谢!

2 个答案:

答案 0 :(得分:8)

request对象可供您的控制器使用。以下方法可用于确定HTTP请求的类型:

if request.get?
  # request is a GET request
if request.post?
  # request is a POST request

其他HTTP请求动词有类似的方法,包括PUT和DELETE。

<强>更新

根据问题的更新,可以在控制器中实现以下代码,以便将任何命名路由上的受约束谓词作为管道分隔的字符串生成:

Rails.application.routes.named_routes["users"].verb
#=> "GET|POST" 

因此,您可以拆分字符串以检索路径constraints中指定的每个HTTP方法的数组:

methods_string = Rails.application.routes.named_routes["users"].verb
#=> "GET|POST"

methods_array = methods_string.split('|')
#=> ["GET", "POST"]

methods_array[0]
#=> "GET"
methods_array[1]
#=> "POST"

答案 1 :(得分:1)

对于将来使用它的人,您可以使用

env["REQUEST_METHOD"]

获取特定操作的HTTP动词