[英]How do you pass data from a controller to a model with Ruby on 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.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)
應該可以正常工作。
應該為::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.