服务对象返回状态
Service Object returning status
我正在制作一个 rails json api,它在控制器操作中使用服务对象,并根据服务中发生的情况,我必须正确渲染 json。该示例如下所示。
star_service.rb
class Place::StarService
def initialize(params, user)
@place_id = params[:place_id]
@user = user
end
def call
if UserStaredPlace.find_by(user: user, place_id: place_id)
return #star was already given
end
begin
ActiveRecord::Base.transaction do
Place.increment_counter(:stars, place_id)
UserStaredPlace.create(user: user, place_id: place_id)
end
rescue
return #didn't work
end
return #gave a star
end
private
attr_reader :place_id, :user
end
places_controller.rb
def star
foo_bar = Place::Star.new(params, current_user).call
if foo_bar == #sth
render json: {status: 200, message: "sth"}
elsif foo_bar == #sth
render json: {status: 200, message: "sth"}
else
render json: {status: 400, message: "sth"}
end
我的问题是,我是否应该 return 来自服务对象的纯文本或者有更好的方法?
当然会有自以为是,但仍然...
使用数据呈现视图、returning 数据、重定向等是控制器的职责。因此,您必须在控制器中处理任何数据、纯文本和其他内容。
服务对象必须为执行任何巨大的复杂操作提供一个单一的public方法。显然,该方法必须 return 简单值,该值告诉控制器操作是否成功完成。所以它必须是 true
或 false
。也许是一些可识别的结果(对象、简单值)或 errors
散列。这当然是理想的用例,但这就是重点。
至于您的用例,您的服务可能 return 消息或 false
。然后控制器将该消息呈现为 json
.
并且您的 star
方法必须存在于您的控制器中,可能是私有的并且看起来像这样:
def star
foo_bar = Place::Star.new(params, current_user).call
if foo_bar
render json: {status: 200, message: foobar}
else
render json: {status: 400, message: "Failed"}
end
end
您的服务:
class Place::StarService
def initialize(params, user)
@place_id = params[:place_id]
@user = user
end
def call
if UserStaredPlace.find_by(user: user, place_id: place_id)
return "Message when star is already given"
end
begin
ActiveRecord::Base.transaction do
Place.increment_counter(:stars, place_id)
UserStaredPlace.create(user: user, place_id: place_id)
end
rescue
return false
end
return "Message if gave a star"
end
private
attr_reader :place_id, :user
end
我正在制作一个 rails json api,它在控制器操作中使用服务对象,并根据服务中发生的情况,我必须正确渲染 json。该示例如下所示。
star_service.rb
class Place::StarService
def initialize(params, user)
@place_id = params[:place_id]
@user = user
end
def call
if UserStaredPlace.find_by(user: user, place_id: place_id)
return #star was already given
end
begin
ActiveRecord::Base.transaction do
Place.increment_counter(:stars, place_id)
UserStaredPlace.create(user: user, place_id: place_id)
end
rescue
return #didn't work
end
return #gave a star
end
private
attr_reader :place_id, :user
end
places_controller.rb
def star
foo_bar = Place::Star.new(params, current_user).call
if foo_bar == #sth
render json: {status: 200, message: "sth"}
elsif foo_bar == #sth
render json: {status: 200, message: "sth"}
else
render json: {status: 400, message: "sth"}
end
我的问题是,我是否应该 return 来自服务对象的纯文本或者有更好的方法?
当然会有自以为是,但仍然...
使用数据呈现视图、returning 数据、重定向等是控制器的职责。因此,您必须在控制器中处理任何数据、纯文本和其他内容。
服务对象必须为执行任何巨大的复杂操作提供一个单一的public方法。显然,该方法必须 return 简单值,该值告诉控制器操作是否成功完成。所以它必须是 true
或 false
。也许是一些可识别的结果(对象、简单值)或 errors
散列。这当然是理想的用例,但这就是重点。
至于您的用例,您的服务可能 return 消息或 false
。然后控制器将该消息呈现为 json
.
并且您的 star
方法必须存在于您的控制器中,可能是私有的并且看起来像这样:
def star
foo_bar = Place::Star.new(params, current_user).call
if foo_bar
render json: {status: 200, message: foobar}
else
render json: {status: 400, message: "Failed"}
end
end
您的服务:
class Place::StarService
def initialize(params, user)
@place_id = params[:place_id]
@user = user
end
def call
if UserStaredPlace.find_by(user: user, place_id: place_id)
return "Message when star is already given"
end
begin
ActiveRecord::Base.transaction do
Place.increment_counter(:stars, place_id)
UserStaredPlace.create(user: user, place_id: place_id)
end
rescue
return false
end
return "Message if gave a star"
end
private
attr_reader :place_id, :user
end