Rails 在服务对象中使用私有和受保护的方法
Rails using private and protected methods in a Service object
我正在尝试将一些业务逻辑从我的一个控制器 StoreController
中移出并移到一个新的 Store::CreateService
服务对象中。最近学习服务,似乎并没有太多的实现它们的既定模式。我 运行 在尝试调用受保护方法时出错。我显然可以将逻辑从那些受保护的方法直接移动到 execute
但我的理解是这对 Rails.
应该没问题
undefined local variable or method `find_and_set_account_id' for #<Store::CreateService:0x00007f832f8928f8>
这是服务对象
module Store
class CreateService < BaseService
def initialize(user, params)
@current_user, @params = user, params.dup
end
def execute
@store = Store.new(params)
@store.creator = current_user
find_and_set_account_id
if @store.save
# Make sure that the user is allowed to use the specified visibility level
@store.members.create(
role: "owner",
user: current_user
)
end
after_create_actions if @store.persisted?
@store
end
end
protected
def after_create_actions
event_service.create_store(@store, current_user)
end
def find_and_set_account_id
loop do
@store.account_id = SecureRandom.random_number(10**7)
break unless Store.where(account_id: account_id).exists?
end
end
end
您在 def execute..end
之后还有一个额外的 end
。那一端关闭 CreateService
class。这意味着您的受保护方法是在 Store
模块上定义的。
因此缺少方法。
我正在尝试将一些业务逻辑从我的一个控制器 StoreController
中移出并移到一个新的 Store::CreateService
服务对象中。最近学习服务,似乎并没有太多的实现它们的既定模式。我 运行 在尝试调用受保护方法时出错。我显然可以将逻辑从那些受保护的方法直接移动到 execute
但我的理解是这对 Rails.
undefined local variable or method `find_and_set_account_id' for #<Store::CreateService:0x00007f832f8928f8>
这是服务对象
module Store
class CreateService < BaseService
def initialize(user, params)
@current_user, @params = user, params.dup
end
def execute
@store = Store.new(params)
@store.creator = current_user
find_and_set_account_id
if @store.save
# Make sure that the user is allowed to use the specified visibility level
@store.members.create(
role: "owner",
user: current_user
)
end
after_create_actions if @store.persisted?
@store
end
end
protected
def after_create_actions
event_service.create_store(@store, current_user)
end
def find_and_set_account_id
loop do
@store.account_id = SecureRandom.random_number(10**7)
break unless Store.where(account_id: account_id).exists?
end
end
end
您在 def execute..end
之后还有一个额外的 end
。那一端关闭 CreateService
class。这意味着您的受保护方法是在 Store
模块上定义的。
因此缺少方法。