2010-03-17 7 views
17

Je suis portage d'une application de Merb 1.1/1.8.7 à Rails 3 (beta)/1.9.1 qui utilise des réponses JSON contenant des fragments HTML, par exemple, un conteneur JSON spécifiant une mise à jour, sur un enregistrement de l'utilisateur, et la mise à jour la ligne de l'utilisateur ressemble à. Dans Merb, puisque tout ce que retourne une méthode de contrôleur est donné au client, on peut assembler un Hash, assigner un rendu à l'une des clés et retourner hash.to_json (bien que ce ne soit certainement pas la meilleure solution). , il semble que pour rendre les données au client, il faut utiliser render et render qui ne peut être appelé qu'une seule fois, donc rendre le hash à json ne fonctionnera pas à cause du rendu partiel. A la lecture, il semble que l'on pourrait mettre ces données dans un fichier JSON .erb view, avec <% = render partial%> in et rendre cela. Existe-t-il une méthode Rails pour résoudre ce problème (renvoyer JSON contenant un ou plusieurs fragments HTML) autre que celle-ci?Dans Rails 3, comment rendre un HTML dans une réponse JSON?

En Merb:
contrôleur :

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 

Dans Rails:
contrôleur :

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 

Vue: 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

Ma réponse à une question similaire http://stackoverflow.com/a/15574453/667598 –

Répondre

-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

Je manque probablement le point: la seule façon dont je peux voir dans cet exemple pour obtenir des fragments HTML dans le JSON serait de mettre en œuvre #to_json sur l'utilisateur et l'ont rendu, qui partials probablement courir la double encontre de rendre problème et, même sinon, ne permettrait pas de différents fragments d'être utilisés dans des contextes différents, par exemple, user_row c. user_detail. Y at-il quelque chose ici que je ne reçois pas? – ylg

26

Le plus proche de l'original de l'approche Merb je pouvais trouver dans Rails est d'utiliser #render_to_string

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

Cela devient un peu juste autour de la complexité qui vient de l'ajout d'une couche de modèles json.erb dans le mélange, que ce soit l'approche Rails Purist que je ne pouvais pas dire; probablement quelque chose avec RJS serait généralement utilisé.

+0

Merci, je cherchais cette méthode "render_to_string"! – Robin

+1

Je remarque que vous pouvez simplement ajouter .html comme extension, le .erb sera ajouté automatiquement, utile si vous utilisez mince (.slim) –

+0

méthode render_to_string a aidé me..thanks .. Je pense que – Abhi

Questions connexes