我有一堆 Rails 模型,假设其中一个叫做 Post。我需要一种方法来以编程方式提取所有路线助手及其各自针对特定模型的方法。
类似这样的事情
Rails.application.routes.named_routes.helper_names.select do |n|
n.include? "post"
end
显然行不通,因为我可以有另一个名为 OtherPost 的模型。
我想要一些类似的东西
{
{"method": "GET", "helper": "post_path", "action": "show"},
{"method": "POST", "helper": "edit_post_path", "action": "update"},
{"method": "GET", "helper": "posts_path", "action": "index"},
...
}
我知道操作和方法位于
Rails.application.routes.routes
-> route.verb
和 route.defaults[:action]
中,但我似乎无法可靠地将它们与助手名称联系起来。
这是你想要的吗?
def extract_routes_for_model(model_name)
Rails.application.routes.routes.map do |route|
verb = route.verb.match(/[A-Z]+/).to_s
path = route.path.spec.to_s
controller_action = route.defaults[:controller]
action = route.defaults[:action]
helper = Rails.application.routes.url_helpers.method_defined?("#{route.name}_path") ? "#{route.name}_path" : nil
if controller_action&.include?(model_name.underscore.pluralize)
{
method: verb,
path: path,
helper: helper,
action: action
}
end
end.compact
end
使用:extract_routes_for_model("Post")
输出将是一个哈希数组,其中包含每个相应路径的信息。