You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Rails 3/3.2技术问询:如何通过控制器与动作名获取路径及HTTP动词

在Rails 3/3.2中根据控制器和动作获取端点路径及HTTP动词

嘿,在Rails 3或者3.2版本里,要针对指定的控制器和动作拿到对应的端点路径,以及它支持的HTTP动词,其实有几个实用的小技巧,我给你详细说说:

一、获取对应的端点路径

不管是在控制器、视图还是控制台里,都可以用以下方式快速生成路径:

1. 通用方法:url_for

这是最万能的方式,不需要依赖命名路由,直接指定控制器和动作即可:

# 生成index动作的路径
url_for(controller: 'posts', action: 'index')
# => "/posts"

# 生成带参数的show动作路径
url_for(controller: 'posts', action: 'show', id: 1)
# => "/posts/1"

# 如果是命名空间下的控制器,比如admin/posts
url_for(controller: 'admin/posts', action: 'index')
# => "/admin/posts"

在Rails控制台里测试的话,直接用app.url_for(...)就行,比如app.url_for(controller: 'posts', action: 'index')

2. 命名路由辅助方法(如果知道的话)

如果你的路由是RESTful风格的,Rails会自动生成对应的命名辅助方法,用起来更简洁:

# 对应posts#index
posts_path
# => "/posts"

# 对应posts#show,带id参数
post_path(1)
# => "/posts/1"

不过这个前提是你清楚对应的命名辅助方法,如果不确定,用url_for更稳妥。

二、获取对应的HTTP动词

要拿到某个控制器动作支持的所有HTTP动词,需要遍历Rails的路由规则来筛选,因为同一个动作可能被配置为支持多个动词(比如自定义路由里的via: [:get, :post])。

1. 控制台快速查询

直接在Rails控制台里执行以下代码,替换成你要查询的控制器和动作名称:

controller_name = 'posts'
action_name = 'index'

Rails.application.routes.routes.select do |route|
  route.defaults[:controller] == controller_name && route.defaults[:action] == action_name
end.map { |route| route.verb.source.gsub(/[$^]/, '') }.uniq

比如查询posts#index会返回["GET"],查询posts#create会返回["POST"],如果是自定义的多动词路由,会返回对应的动词数组。

2. 封装成方法复用

如果需要在代码里多次使用,可以封装成一个辅助方法(比如放在application_controller.rb里):

def get_supported_http_verbs(controller_name, action_name)
  Rails.application.routes.routes.select do |route|
    route.defaults[:controller] == controller_name && route.defaults[:action] == action_name
  end.map { |route| route.verb.source.gsub(/[$^]/, '') }.uniq
end

调用的时候直接传参数就行:get_supported_http_verbs('posts', 'custom')


内容的提问来源于stack exchange,提问作者andriy-baran

火山引擎 最新活动