2010-03-17 4 views
17

Merb 1.1/1.8.7에서 HTML 단편을 포함하는 JSON 응답 (예 : 업데이트를 지정하는 JSON 컨테이너, 사용자 레코드) 및 업데이트 된 JSON 응답을 사용하는 Rails 3 (베타)/1.9.1로 이식하고 있습니다. 사용자 행 모양입니다. Merb에서는 컨트롤러 메소드가 반환하는 것이 무엇이든간에 클라이언트에 해시를 넣고 렌더링 된 부분을 키 중 하나에 할당하고 hash.to_json을 반환 할 수 있습니다 (물론 이것이 최선의 방법은 아닐 수도 있습니다). 레일즈 , 클라이언트에 데이터를 다시 얻으려면 렌더링을 사용해야하고 렌더링은 한 번만 호출 할 수 있으므로 해시를 json으로 렌더링하는 것이 부분 렌더링 때문에 작동하지 않습니다.Rails 3에서 JSON 응답 내에서 HTML을 어떻게 렌더링합니까?

주위를 읽으면서, 해당 데이터를 JSON .erb보기 파일에 넣을 수 있습니다. < % = 부분 % %>을 렌더링하고 렌더링합니다. 이 문제를 해결하는 Rails 방식 (하나 이상의 HTML 조각이 포함 된 JSON 반환)이 있습니까? Merb는

에서

:
컨트롤러 : 레일

only_provides :json 
... 
self.status = 204 # or appropriate if not async 
return { 
    'action' => 'update', 
     'type' => 'user', 
     'id' => @user.id, 
     'html' => partial('user_row', format: :html, user: @user) 
}.to_json 

:
컨트롤러 :

respond_to do |format| 
    format.json do 
    render template: '/json/message-1', 
     locals: { 
     action: 'update', 
     type: 'user', 
     id: @user.id, 
     partial: 'user_row.html.erb', 
     locals: { user: @user } 
     } 
    end 
end 

전망 : JSON/메시지 1.json.erb

{ 
    "action": <%= raw action.to_json %>, 
    "type": <%= raw type.to_json %>, 
    "id": <%= raw id.to_json %>, 
    "html": <%= raw render(partial: partial, locals: locals).to_json %> 
} 
+0

비슷한 질문에 대한 대답 http://stackoverflow.com/a/15574453/667598 –

답변

-12
class UsersController < ApplicationController 
    respond_to :json 

    def show 
    @user = User.find(params[:id]) 
    respond_with(@user) do |format| 
     if @user.save 
     format.json { render :json => @user } 
     else 
     format.json { render :json => @user.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 
end 
+0

이 예제에서 JSON에 HTML 조각을 가져 오는 방법은 내가 알 수있는 유일한 방법입니다. #to_json을 User에 구현하고 부분 렌더링을 수행해야합니다. 이중 렌더링 문제와 충돌 할 가능성이 높습니다. 그렇지 않은 경우에도 다른 부분 (예 : user_row v. user_detail)에서 다른 단편을 사용할 수 없습니다. 여기에 뭔가가 있습니까? – ylg

26

나는 레일에서 찾을 수 Merb는 접근 방식에서 원본에 가장 가까운이 믹스에 json.erb 템플릿 레이어를 추가에서 오는 복잡성의 공정한 조금 주위에 얻을 수 #render_to_string

render json: { 
    'action' => 'update', 
    'type' => 'user', 
     'id' => @user.id, 
    'html' => render_to_string(partial: 'user_row.html.erb', locals: { user: @user }) 
} 

을 사용하는 것입니다, 그것이 레일즈 퓨어 스트 접근법인지 여부는 말할 수 없습니다. 아마도 일반적으로 RJS와 함께 사용될 것입니다.

+0

고마워, 나는이 "render_to_string"메서드를 찾고 있었다! – Robin

+1

또한 .html을 확장명으로 추가 할 수 있습니다. 슬림 (.slim)을 사용하는 경우 .erb가 자동으로 추가됩니다. –

+0

render_to_string 메서드가 도움이되었습니다 .. 감사합니다 .. – Abhi