【问题标题】:How to follow DRY principles in different namespaces Rails 4.2?如何在不同的命名空间 Rails 4.2 中遵循 DRY 原则?
【发布时间】:2015-08-22 01:18:52
【问题描述】:

基本上我开发了一个有两个命名空间的应用程序:admin、api 和公共的(例如简单的resources :users)。一切正常,但是我重复了很多次,因为 api 中的一些控制器可以很容易地在 admin 中使用。

在这种情况下,我如何干燥我的代码以保留命名空间?

谢谢!

【问题讨论】:

    标签: ruby-on-rails api ruby-on-rails-4 namespaces


    【解决方案1】:

    我可以想到几种方法:

    1. (不推荐) - 将 url 发送到您的 routes.rb 文件中的同一控制器。

    2. 控制器继承自的共享命名空间

    例如,您可以:

    # controllers/shared/users_controller.rb
    class Shared::UsersController < ApplicationController
      def index
        @users = User.all
      end
    end
    
    
    # controllers/api/users_controller.rb
    class Api::UsersController < Shared::UsersController
    end
    
    
    # controllers/admin/users_controller.rb
    class Admin::UsersController < Shared::UsersController
    end 
    

    以上内容将允许您在相关控制器之间共享您的索引操作。在这种情况下,您的路线文件如下所示:

    # config/routes.rb
    namespace :api do
      resources :users
    end
    namespace :admin do
      resources :users
    end
    

    共享一个操作肯定有很多代码,但价值会随着共享操作的数量成倍增加,而且最重要的是,您的代码位于一个位置。

    【讨论】:

    • 将共享控制器放在主控制器目录中会有所不同吗?在app/controllers?
    • 不,无论哪种方式都可以,这取决于您要如何组织它。我确实认为将共享控制器放在共享文件夹中会更清晰
    • 那行不通。 API 控制器(例如)从 ApplicationController 继承,而共享控制器没有。当我添加 class Shared::PostsController &lt; ActionController::Base 时它不起作用,我开始收到大量错误
    • 抱歉,任何基本控制器都应该继承自 ApplicationController。我现在正在更新答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 2017-03-18
    • 2014-10-11
    • 2020-09-11
    • 1970-01-01
    相关资源
    最近更新 更多