2017-02-03 1 views
1

나는 컨트롤러 json에서 서비스 객체를 사용하는 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

죄송합니다. 답변을 다시 생각하고 업데이트했습니다. 아니요, 서비스를 삭제할 필요가 없습니다. 서비스는 생명입니다 :) 서비스는 결과 또는 거짓을 반환합니다. 컨트롤러의 동작 (private 메서드 사용)은'false '가 아닌 경우 결과를 렌더링합니다. – VAD

관련 문제