2017-04-19 6 views
1

특정 작업이 수행 될 때 웹 소켓을 사용하여 json 메시지를 클라이언트에 보냅니다. jbuilder 파일에서 뷰 헬퍼를 사용하여 json 데이터를 멋지게 포맷 할 수 있습니다.jbuilder를 사용하여 레일스에서 ​​컨트롤러의 뷰에 부분 변수를 렌더링하는 방법은 무엇입니까?

컨트롤러에서 뷰 준비 json을 변수로 가져 오는 방법은 무엇입니까? 내가 사용한 가장 좋은 방법은 String을 반환하는 render_to_string을 사용하는 것입니다. 그래서 JSON.parse을해야합니다. 이것은 많은 낭비를 초래합니다.

그래서 나는이 있습니다

JSON에 show.json.jbuilder를 렌더링 한 후 다시 JSON로 구문 분석 문자열로 반환
msg = JSON.parse(render_to_string('show')) 

.

효과가 있지만 너무 느립니다!

답변

0

나는 몇 시간 동안 비틀 거리며 또한 잘못한 일을하고 있습니다. 두 가지 끔찍한 해킹이 있습니다. 첫 번째 문제는 jbuilder를 사용하여 json을 구성하여 MVC 컨텍스트가 아닌 sidekiq 작업자의 페이로드에 저장하려고했습니다. 다행히도 필자는 하나의 표현 만 필요로하므로 본질적으로 템플릿을 다시 작성했습니다 user.rb 아래에 표시된 수정 된 예제. 다음

def to_builder 
    Jbuilder.new do |user| 
    user.external_id id 
    user.username username 
    user.full_name full_name 
    end 
end 

그리고

는 믿을 수 없을만큼 바보 json으로를 저장하는
to_user_hash = {} 
to_user_hash["user"] = JSON.parse(user.to_builder.target!) 

을 사용했다.

active_model_serializers을 사용할 때 sidekiq 작업자가 websockets을 통해 실시간 활동 페이지를 렌더링하고 다음을 수행했습니다.

class ActivityBroadcasterWorker < ApplicationWorker 
    sidekiq_options queue: :low, retry: true, backtrace: true 

    def perform(activity_id) 
    view = ActionView::Base.new(ActionController::Base.view_paths) 
    view.class_eval("include Rails.application.routes.url_helpers") 
    view.extend ApplicationHelper 

    if activity = PublicActivity::Activity.find_by_id(activity_id) 
     template = view.render_activity(activity) 
     ActionCable.server.broadcast('activity_channel', message: template) 
    end 
    end 
end 

는 단순히 내 자원이 여기 제이빌더 말할 수있는 더 나은 솔루션을 발견했고, 나는이보기 또는 부분이보기를 렌더링 할?