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




