我正在做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;并启动服务器。但它并没有解决这个问题。
答案 0 :(得分:0)
例如
应用/模型/关切/ 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