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。
谢谢!
答案 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动词