簡體   English   中英

您如何從Rails中的控制器引用另一個類?

[英]How do you reference another class from a controller in ruby on rails?

我正在嘗試在控制器內部使用服務類。 我無法弄清楚如何在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

我試圖引用位於app/services/users_service.rb這個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文件有關,但我不確定。

我認為問題在於您的文件名: 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)應該可以正常工作。

應該為::Services::UserService.new(user_params) ,Ruby假設您在Api :: V1模塊中聲明了此類, ::表示根模塊。 或者您可以這樣聲明您的服務:

class Api::V1::Services::UserService end

我認為這是因為定義了名稱空間。 只需將您的服務類直接放在服務目錄中就可以了。 檢查ActiveSupport::Dependencies.autoload_paths ,以了解有關包括哪些文件夾的基本信息。 即使使用名稱空間,也需要使用它來更新自動加載路徑。 像下面這樣

config.autoload_paths += %W( #{config.root}/app/your_xyz_path )

這樣定義服務就足夠了。 不需要命名空間:

class UserService
end

# using
@service = UserService.new(user_params)

app目錄下的代碼將自動加載,所有目錄也將自動加載。 因此,服務類中不應有名稱空間。

class UserService
end

這應該適用於任何控制器或模型/類

user_service = UserService.new

無需定義名稱空間,只需使用您的服務名稱編寫名稱空間,如下所示

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')]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM