17


6

Rails 3では、JSONレスポンス内でHTMLをどのようにレンダリングしますか?

Merb 1.1 / 1.8.7からRails 3(ベータ)/ 1.9.1に、HTMLフラグメントを含むJSON応答(更新を指定するJSONコンテナー、ユーザーレコード、更新されたユーザー行など)を使用するアプリケーションを移植していますのように見えます。 Merbでは、コントローラーメソッドが返すものはすべてクライアントに渡されるため、ハッシュをまとめて、レンダリングされたパーシャルをキーの1つに割り当て、hash.to_jsonを返すことができます(ただし、これは最善の方法ではありません)。 、クライアントにデータを戻すにはレンダーを使用する必要があり、レンダーは1回しか呼び出すことができないため、jsonへのハッシュのレンダリングは部分的なレンダーのために機能しません。

読み返してみると、そのデータをJSON .erbビューファイルに入れ、<%= render partial%>を入れてレンダリングできるようです。 それ以外にこの問題を解決するRailsの方法(1つ以上の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

Railsの場合:+コントローラー:

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 / message-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 %>
}

3 Answer


26


Railsで見つけることができるMerbのオリジナルのアプローチに最も近いのは、http://api.rubyonrails.org/classes/ActionController/Base.html#M000659 [#render_to_string]を使用することです

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

これは、json.erbテンプレートのレイヤーをミックスに追加することから生じるかなり複雑な部分を回避します。RailsPuristのアプローチとは言えません。通常、RJSを使用したものが通常使用されます。


3


json.erbファイルのソリューションが他にもある別の質問があります。 json erbテンプレートは他のhtmlパーシャルを見つけることができません


-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