我正在尝试使用控制器内的服务类。我无法弄清楚如何在rails中引用其他类。这是我的users_controller
,位于app/controllers/api/v1
:
class Api::V1::UsersController < ApplicationController
respond_to :json
skip_before_filter :verify_authenticity_token
before_filter :initialize_user_service
def create
@service.create
render json: CustomResponse.new(
{
user: @service.user,
}
)
end
def initialize_user_service
@service = Services::UserService.new(user_params)
end
def user_params
params.permit(:email, :password, :password_confirmation, :first_name, :last_name)
end
end
我正在尝试引用users_service.rb
中的app/services/users_service.rb
类:
class Services::UserService
attr_reader :session, :user
def initialize(params)
# @user_id = params[:id]
@params = params
end
def create
user = User.create(@params)
if user.save
return user
else
false
end
end
end
但是我在控制台中收到以下错误:
NameError (uninitialized constant Api::V1::UsersController::Services):
有谁知道我可以做什么来访问这个课程?我找不到解决方案。我想它可能与我的config/application.rb
文件有关,但我不确定是什么。
答案 0 :(得分:3)
我认为,问题在于您的文件名:app/services/users_service.rb
。由于您的班级名称为UserService
,因此应该是:app/services/user_service.rb
(user_service
而不是users_service
)。
UserService
将在自动加载路径中从名为user_service.rb
的文件中加载该类。
按以下方式定义您的服务:
文件名:app/services/user_service.rb
。
定义:
module Services
class UserService
attr_reader :session, :user
def initialize(params)
# @user_id = params[:id]
@params = params
end
def create
user = User.create(@params)
if user.save
return user
else
false
end
end
end
end
Services::UserService.new(user_params)
应按预期工作。
答案 1 :(得分:0)
应该是::Services::UserService.new(user_params)
,Ruby假设您在Api :: V1模块中声明此类,::
表示根模块。或者您可以这样声明您的服务:
class Api::V1::Services::UserService
end
答案 2 :(得分:0)
我认为这是因为定义的命名空间。只需将服务类直接放在服务目录中即可。检查ActiveSupport::Dependencies.autoload_paths
以了解包含哪些文件夹的基本概念。即使您使用的是命名空间,也需要使用它来更新自动加载路径。
类似下面的内容
config.autoload_paths += %W( #{config.root}/app/your_xyz_path )
答案 3 :(得分:-1)
定义这样的服务就足够了。这不需要命名空间:
class UserService
end
# using
@service = UserService.new(user_params)
答案 4 :(得分:-1)
app目录下的代码是自动加载的,也是所有目录。所以服务类中不应该有命名空间。
class UserService
end
这应该适用于任何控制器或模型/类,如
user_service = UserService.new
答案 5 :(得分:-1)
无需定义命名空间,只需使用您的服务名称编写它,如下面的
class UserService
attr_reader :session, :user
def initialize(params)
# @user_id = params[:id]
@params = params
end
def create
user = User.create(@params)
if user.save
return user
else
false
end
end
end
使用UserService.new(params)
调用它
对于生产模式,在application.rb
文件中定义它以自动加载服务,如下所示
config.autoload_paths += Dir[Rails.root.join('app', 'services')]