Rails模型直接使用其他类方法

时间:2016-02-29 09:58:28

标签: ruby-on-rails ruby

我正在做Rails应用程序,我发现我可以重构我的代码。只是无法找到方法。
我有许多模型,如公司,新闻,档案等,使用图片上传。因此,在每个类中,我必须始终复制粘贴30行方法,这些方法始终实现相同的逻辑 - upload_image,get_image_name,delete_image。
怎么可能,我的Model类会自动从其他地方获取方法?我想把模型 - 加载' GlobalMethods',甚至以某种方式在activerecord中包含这些方法:base只为每个类提供它们,我会随时随地使用它。
从控制器我会留下原样。例如 - News.upload_image,它会这样做,因为这个逻辑将在原始模型中。
请举例解释,因为我已经更多地了解并且没有理解甚至可能。

这时我做了:

#models/concerns/uploading.rb
module Uploading
  extend ActiveSupport::Concern

  included do
    def do_upload
        puts 'aaaaaaaaaaaaaaa'
    end
  end
end

和型号:

class Company < ActiveRecord::Base
    include Uploading
end

我收到此错误:

  

未初始化的常量公司::上传

我的导轨版本:&#39; 4.2.5&#39;
每次尝试后我都重启了服务器 我的application.rb文件看起来:

require File.expand_path('../boot', __FILE__)

require 'rails/all'

Bundler.require(*Rails.groups)

module Vca
  class Application < Rails::Application
    config.active_record.raise_in_transactional_callbacks = true
    config.autoload_paths += %W(
      #{config.root}/app/models/concerns/uploading.rb
    )
  end
end

仍然相同

  

CompaniesController中的NameError #index

     

未初始化的常量公司::上传

class Company < ActiveRecord::Base
    include Uploading  # <-- error
end


我有宝石&#39;春天&#39;我关掉了服务器,在终端i runned&#34; spring stop&#34;并启动服务器。但它并没有解决这个问题。

2 个答案:

答案 0 :(得分:0)

查看ActiveSupport::Concern

例如

应用/模型/关切/ my_concern.rb

module MyConcern
  extend ActiveSupport::Concern

  included do
    # common stuff here
  end

  class_methods do
    # define class methods here
  end
end

应用/模型/ my_model.rb

class MyModel < ActiveRecord::Base
  include MyConcern

  # ...
end

顺便说一句,您可以在self块中引用included的模型类,并在任何实例方法中引用,并在class_methods块中的方法内部。

答案 1 :(得分:0)

您会注意到您的标准rails项目在describe('CategoryControllerTests', function () { beforeEach(angular.mock.module('myAppTest')); describe('sets the controller', function () { var controller, scope, StoreService2; beforeEach(inject(function ($rootScope, $controller, _StoreService_) { scope = $rootScope.$new(); StoreService2 = _StoreService_ controller = $controller('CategoryController', { $scope: scope, StoreService: StoreService2 }); })); it("categories length property", function () { var categories = scope.categories; expect(categories.length).toEqual(2); }); }); }); var module = angular.module("myAppTest", []).service("StoreService", ["$http", function ($http) { this.GetAllCategories = function () { var categoriesLocal = []; $.ajax({ url: "http://localhost:58641/Category/GetAllCategories/", type: "GET", data: "{}", dataType: 'json', error: function (xhr, ajaxOptions, thrownError) { alert(xhr.status); alert(xhr.responseText); alert(thrownError); }, success: function (result) { categoriesLocal = result; }, async: false }); return categoriesLocal; } }]).controller("CategoryController", ["$scope", "StoreService", function ($scope, StoreService) { $scope.categories = StoreService.GetAllCategories(); }]); 文件夹下包含一个名为concerns的文件夹。

在该文件夹中创建一个模块models

image_handling.rb

在贵公司,新闻,档案模型中引起关注......

module ImageHandling
  extend ActiveSupport::Concern
  included do
    # ...(include all your common methods here)
  end
end