2010-03-17 8 views
17

Ich portiere eine Anwendung von Merb 1.1/1.8.7 nach Rails 3 (beta)/1.9.1, die JSON-Antworten mit HTML-Fragmenten verwendet, z. B. einen JSON-Container, der ein Update angibt, auf einem Benutzerdatensatz und dem aktualisierten Benutzerzeile sieht aus wie. In Merb, da was auch immer eine Controller-Methode zurückgibt, dem Client gegeben wird, kann man einen Hash zusammenstellen, ein gerendertes Partial einem der Schlüssel zuweisen und hash.to_json zurückgeben (obwohl das sicherlich nicht der beste Weg ist). In Rails Es scheint, dass, um Daten zurück zum Client zu bekommen, man muss Render verwenden und Rendern kann nur einmal aufgerufen werden, so Rendering der Hash zu Json wird nicht funktionieren wegen der partiellen Render.In Rails 3, wie rendert man HTML innerhalb einer JSON-Antwort?

Aus dem Lesen von es scheint, könnte man diese Daten in eine JSON-.erb-View-Datei mit <% = partiellen%> in und render rendern. Gibt es eine Rails-Methode zur Lösung dieses Problems (JSON mit einem oder mehreren HTML-Fragmenten zurückgeben)?

In Merb:
Controller:

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 

In Rails:
Controller:

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 

Ansicht: 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 %> 
} 
+0

Meine Antwort auf eine ähnliche Frage http://stackoverflow.com/a/15574453/667598 –

Antwort

-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

Ich vermisse wahrscheinlich den Punkt: Die einzige Möglichkeit, die ich in diesem Beispiel sehen kann, um HTML-Fragmente in den JSON zu bekommen, wäre sei es, #to_json auf User zu implementieren und Teiltöne rendern zu lassen, was vermutlich mit dem Doppel-Rendering-Problem zusammenhängt und selbst wenn nicht, würde es nicht zulassen, dass verschiedene Fragmente in verschiedenen Kontexten verwendet werden, zB user_row v. user_detail. Gibt es hier etwas, das ich nicht verstehe? – ylg

26

in der Nähe von dem Original von Merb Ansatz, den ich in Rails finden konnte #render_to_string

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

Dies wird um ein gutes Stück von Komplexität zu verwenden ist, die sich aus der Addition einer Schicht aus json.erb Vorlagen in die Mischung kommt, Ob es Rails Purist ist, kann ich nicht sagen; möglicherweise würde etwas mit RJS in der Regel verwendet werden.

+0

Danke, ich habe nach dieser "render_to_string" -Methode gesucht! – Robin

+1

Ich bemerkte, dass Sie auch nur .html als Erweiterung hinzufügen können, wird die .erb automatisch hinzugefügt, nützlich, wenn Sie schlanke (.slim) verwenden –

+0

render_to_string Methode hat mir geholfen .. danke .. – Abhi