2017-02-03 78 views
1

我正在製作一個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 

我的問題是,我是否應該從服務對象返回純文本或有一些更好的辦法?

回答

1

它會自以爲是的過程,但仍然...

渲染的數據視圖,返回數據,重定向等是控制器的責任。因此,您必須在控制器中處理任何數據,純文本和其他內容。

服務對象必須爲任何龐大的複雜操作執行提供單一的公共方法。顯然,該方法必須返回簡單的值,告訴控制器操作是否成功完成。所以它必須是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