如何在轨道上的ruby中引用控制器中的另一个类?

时间:2017-12-26 03:24:06

标签: ruby-on-rails ruby controller

我正在尝试使用控制器内的服务类。我无法弄清楚如何在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文件有关,但我不确定是什么。

6 个答案:

答案 0 :(得分:3)

我认为,问题在于您的文件名:app/services/users_service.rb。由于您的班级名称为UserService,因此应该是:app/services/user_service.rbuser_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')]