2017-02-03 8 views
1

私は、コントローラのアクションでサービスオブジェクトを使用するレール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

それはもちろん独断することがありますが、それでも...

は、データとビューのレンダリングには、データを返す、などをリダイレクトすることは、コントローラの責任です。あなたのコントローラーで扱わなければならないデータ、プレーンテキストなど。

サービスオブジェクトは、巨大な複雑な操作を実行するための単一のパブリックメソッドを提供する必要があります。そして、明らかに、そのメソッドは、操作が正常に完了したかどうかをコントローラに伝える単純な値を返す必要があります。したがって、trueまたはfalseである必要があります。おそらく何らかの認識可能な結果(オブジェクト、単純値)またはerrorsハッシュもちろん理想的なユースケースですが、それがポイントです。

ご使用のサービスでは、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

関連する問題