加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 如何验证rails应用程序中所有路由的控制器操作

发布时间:2020-12-17 02:49:58 所属栏目:百科 来源:网络整理
导读:有没有办法验证所有控制器操作,如config / routes.rb中定义并由rake路由公开,实际上对应于现有的控制器操作? 例如,假设我们有以下路由文件: Application.routes.draw do resources :foobarend 以下控制器: class FoobarsController ApplicationController
有没有办法验证所有控制器操作,如config / routes.rb中定义并由rake路由公开,实际上对应于现有的控制器操作?

例如,假设我们有以下路由文件:

Application.routes.draw do
  resources :foobar
end

以下控制器:

class FoobarsController < ApplicationController
  def index
    # ...
  end

  def show
    # ...
  end
end

我想有一些方法可以自动检测创建,新建,编辑,更新和销毁操作(由路由隐式定义)没有映射到有效的控制器操作 – 这样我就可以修复routes.rb文件:

Application.routes.draw do
  resources :foobar,only: [:index,:show]
end

如果愿意,可以对路线进行“完整性检查”.

这种检查不一定需要完美;我可以轻松地手动验证任何误报. (虽然“完美”检查是理想的,因为它可以包含在测试套件中!)

我的动机是防止由狡猾的API请求引发AbstractController :: ActionNotFound异常,因为无意中定义了额外的路由(在大型应用程序中).

解决方法

我很好奇,以下是我的尝试.它仍然不准确,因为它还没有匹配正确的格式.此外,一些路线有限制;我的代码还没有考虑.

rails console:

todo_skipped_routes = []
valid_routes = []
invalid_routes = []

Rails.application.routes.routes.each do |route|
  controller_route_name = route.defaults[:controller]
  action_route_name = route.defaults[:action]

  if controller_route_name.blank? || action_route_name.blank?
    todo_skipped_routes << route
    next
  end

  # TODO: maybe Rails already has a "proper" way / method to constantize this
  controller_class = "#{controller_route_name}_controller".camelcase.safe_constantize

  is_route_valid = !controller_class.nil? && controller_class.instance_methods(false).include?(action_route_name.to_sym)

  # TODO: check also if "format" matches / gonna be "responded to" properly by the controller-action
  #   check also "lambda" constraints,and `request.SOMEMETHOD` constraints (i.e. `subdomain`,`remote_ip`,`host`,...)

  if is_route_valid
    valid_routes << route
  else
    invalid_routes << route
  end
end

puts valid_routes
puts invalid_routes

# puts "friendlier" version
pp invalid_routes.map(&:defaults)
# => [
#  {:controller=>"sessions",:action=>"somenonexistingaction"},#  {:controller=>"posts",:action=>"criate"},#  {:controller=>"yoosers",:action=>"create"},# ]

我也有兴趣知道其他答案,或者是否有正确的方法来做到这一点.此外,如果有人知道我的代码有所改进,请告诉我.谢谢 :)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读