gpt4 book ai didi

ruby-on-rails - 如何验证为 Rails 应用程序中的所有路由定义了 Controller 操作?

转载 作者:数据小太阳 更新时间:2023-10-29 07:25:26 25 4
gpt4 key购买 nike

有没有办法验证所有 Controller 操作,如 config/routes.rb 中定义的那样?并由 rake routes 公开, 实际上对应于现有的 Controller 操作?

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

Application.routes.draw do
resources :foobar
end

以及以下 Controller :

class FoobarsController < ApplicationController
def index
# ...
end

def show
# ...
end
end

我想要一些自动检测 create 的方法, new , edit , updatedestroy操作(由路由隐式定义)未映射到有效的 Controller 操作 - 因此我可以修复 routes.rb文件:

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

路由的“完整性检查”,如果你愿意的话。

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

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

最佳答案

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

rails 控制台:

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
# copied over @max answer, because I forgot to consider namespacing
controller_class = "#{controller_route_name.sub('\/', '::')}_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"},
# ]

我也很想知道其他答案,或者是否有合适的方法来做到这一点。另外,如果有人知道我的代码有什么改进之处,请告诉我。谢谢 :)

关于ruby-on-rails - 如何验证为 Rails 应用程序中的所有路由定义了 Controller 操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52891080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com