18

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

読んでみると、そのデータをJSON .erbビューファイルに入れて、<%=レンダリング部分%>を入れてレンダリングできるようです。それ以外に、この問題を解決するRails-way(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 %>
}
4

3 に答える 3

27

Railsで見つけた元のMerbアプローチに最も近いのは、#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 テンプレートのレイヤーをミックスに追加することで発生するかなりの複雑さを回避できます。通常、RJS を使用したものが使用される可能性があります。

于 2010-03-19T19:34:36.847 に答える
3

json.erb ファイルの解決策が他にもある別の質問があります。json erb テンプレートが他の html パーシャルを見つけられないを参照してください

于 2011-04-06T21:16:35.613 に答える
-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
于 2010-03-17T04:10:43.407 に答える