服务对象返回状态

问题描述:

我正在制作一个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 

我的问题是,我是否应该从服务对象返回纯文本或有一些更好的办法?

它会自以为是的过程,但仍然...

渲染的数据视图,返回数据,重定向等是控制器的责任。因此,您必须在控制器中处理任何数据,纯文本和其他内容。

服务对象必须为任何庞大的复杂操作执行提供单一的公共方法。显然,该方法必须返回简单的值,告诉控制器操作是否成功完成。所以它必须是truefalse。也许一些可识别的结果(对象,简单值)或散列值。这当然是理想的用例,但它是关键。

至于您的使用情况,您的服务可能会返回消息或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 
+0

那么,你是说我应该删除服务和移动逻辑控制器? –

+0

对不起,我重新考虑了一下这个答案并更新了它。不,你不需要删除服务。服务就是生活!:)服务返回结果或错误。控制器的行为(可能使用私有方法)会呈现结果,如果它不是“false” – VAD