【问题标题】:Autoloading rails controllers outside app/controllers folder在 app/controllers 文件夹外自动加载 rails 控制器
【发布时间】:2020-05-14 18:51:58
【问题描述】:

有没有办法在app/controllers 文件夹之外正确加载控制器? 背景——情况是我们有多个客户端,我们不想分叉和创建特定于客户端的 Rails 应用程序,因此,我们只有一个应用程序,我们通过服务控制业务逻辑。应用程序的版本通过ENV 变量确定。

我们已定义 app/controllers 文件夹将仅用于共享逻辑,并且我们为 app/clients/[CLIENT]/ 内的每个客户端创建了文件夹,用于满足特定于客户端的需求 - 服务、关注点、配置、控制器,甚至是特定的路线会到这里。

通过这个app/clients/[CLIENT]/controllers,我们想额外加载客户端特定的路由和控制器。客户端文件夹中的示例控制器可能如下所示。

module Clients
  module ClientA
    module Controllers
     module Api
       module V1
        class RentalsController < ApplicationController; end
       end
     end
    end
  end
end

有没有办法正确加载这个? 我尝试在application.rb中执行以下操作

config.autoload_paths += %W(#{config.root}/app/clients/ENV['CLIENT']/**/**)

那你怎么安装这个控制器呢?我尝试了以下方法,但没有奏效。

resources :rentals, controller: 'clients/ClientA/controllers/api/v1/rentals' do

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    对文件夹使用snake_case -- client_a 而不是ClientA

    然后:

    config.autoload_paths <<
      Rails.root.join(
        'app',
        'clients',
        ENV['CLIENT'].underscore,
        'controllers',
        '**'
      )
    

    【讨论】:

    • 好答案!对于路由,也许只使用通配符。 resources :rentals, controller: 'clients/*client/controllers/api/v1/rentals' doguides.rubyonrails.org/…
    • 遗憾的是,由于某种原因,路由并没有真正起作用。 ArgumentError: 'client/client_a/controllers/api/v1/rentals' is not a supported controller name. This can lead to potential routing problems. See https://guides.rubyonrails.org/routing.html#specifying-a-controller-to-use
    • @GeorgeMorris clients/ 不是 client/
    猜你喜欢
    • 2019-12-30
    • 1970-01-01
    • 2015-06-06
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多