2014-12-04 5 views
0

안녕하세요 모든 초보자 질문입니다.액션 컨트롤러 도우미 클래스를 만드는 방법과 컨트롤러 액션에서 액션 컨트롤러 도우미 클래스에 액세스하는 방법은 무엇입니까?

사용자에게 결과를 보여준 후 백그라운드에서 다른 작업을 수행하여 데이터베이스를 업데이트해야하는 레일 애플리케이션을 하나 만들고 있습니다.

내가 원격 서버에서 데이터를 가져 오기 위해 타사 API를 사용하고 내 컨트롤러의 액션에서

(미안 내가 일을 설명에서 가난한 오전, 상황에 내 예제 코드 참조). 가져온 데이터를 사용자에게 표시 한 후 가져온 데이터의 사용자 정의 데이터로 데이터베이스 테이블을 업데이트하려고합니다.

class MyController < ApplicationController 
def SomeAction 
    #some logic 
    @result = FetchDataFromApi#Using third party api to fetch huge data 
    #show result to user 
    #after showing i need to do following operations elsewhere (controller helper) 
    #based on some fetched result i want to update my table 
    myId = @result.id 
    dataObj = MyModel.find(myId) 
    info = @result.information.gsub(',',' ') #some string operation 
    dataObj.update_attributes(:info, info) 
end 
end 

사용자에게 결과를 표시 한 후 추가 작업을 수행하려면 spawnling 보석을 사용할 수 있습니다. 그러나 헬퍼 또는 다른 레일 물건으로이 작업을 수행 할 수 있는지 궁금합니다.

+0

당신은 배경에서 아무것도 실행해야하는 경우 sidekiq 또는 유사한 도구를 사용해야합니다. – BroiSatse

+0

@BroiSatse는 actioncontroller 도우미와 관련된 부작용이 있습니까? – Aparichith

+0

ActionCOntroller 헬퍼는 sth를 염두에 두지 않는 한 컨트롤러와 뷰 사이의 다리 역할을합니다. 응답은 요청 수명주기의 마지막 단계로 항상 보내 지므로 비 백그라운드 코드는 응답을 보내기 전에 실행을 완료해야합니다. 스레드를 사용해 볼 수도 있지만 문제가 더 많이 발생합니다. Sidekiq은 모든 프로젝트에서 사용한 솔루션이며, 그 일을 올바르게 수행하는 것 같습니다. – BroiSatse

답변

0

백그라운드 처리를 사용하는 것이 타당한 경우가 있지만. 이것은 그들 중 하나가 아닙니다.

'사용자에게 결과 표시'는 API에서 가져온 데이터를 기반으로 일부 템플릿을 렌더링한다고 가정합니다.

사실, 외부 API를 백그라운드로 액세스하는 것이 좋지만 흐름을 변경해야 할 수도 있습니다. db 레코드를 업데이트하는 경우 일반적으로 백그라운드로 이동하지 않는 것이 좋습니다.

말했다되고 있음을

, 내가 컨트롤러에서 업데이트를하지 않을 것, 나는 모델 또는 '돌연변이'클래스로 이동 줄 :

class Model 
    def self.update_from_api 
    res = API.fetch ... 
    object = find res.id 
    object.update_from_api! res 
    res 
    end 

    def update_from_api(api_data) 
    update_attributes! info: api_data.gsub(....) 
    end 
end 
+0

제안 해 주셔서 감사합니다. 나는 너의 제안을 시도하고 너에게 알릴 것이다. – Aparichith

관련 문제