2008-11-18 5 views
14

J'ai un FooController qui répond à HTML et les requêtes JS (AJAX):Comment inclure du HTML dans une réponse JS Rails?

# app/controllers/foo_controller.rb: 
class FooController < ApplicationController 
    layout 'foo' 
    def bar 
    respond_to do |format| 
     format.html # foo/bar.html.erb 
     format.js # foo/bar.js.erb 
    end 
    end 
end 

Les modèles pour le soutenir:

# app/views/layouts/foo.html.erb: 
<html>...<%= yield %>...</html> 

# app/views/layouts/foo.json.erb: 
<%= yield %> 

Et un modèle AJAX dans lequel je veux rendre une partie:

# app/views/foo/bar.js.erb: 
dojo.byID('some_div').innerHTML = "<%= escape_javascript(render(:partial => 'some/partial')) %>"; 

Si le modèle JS a tout simplement vieux JS dedans (comme alert('hi');), il utilise mon modèle de JS. Quand je mets le rendu (: partial), cependant, il fait que toute la réponse utilise le template HTML, ce qui signifie que JS n'est plus valide.

Une solution possible est d'utiliser une fonction pour la mise en page:

class FooController < ApplicationController 
    layout :choose_layout 
    ... 
    private 
    def choose_layout 
    return nil if request.xhr? 
    'foo' 
    end 
end 

Mais ma version devrait travail! Pourquoi pas?

+0

Je pense que la raison pour laquelle cela n'a pas fonctionné était un petit bug: j'avais un template .json.erb, mais pas de .js.erb un et pas de défaut .erb un. –

Répondre

7

La plus récente Railscast covers this topic (using jQuery).

Je ne suis pas tout à fait voir où vous pourriez aller mal, mais voici un snippit du Railscast qui fonctionne très bien pour rendre une partielle:

// views/reviews/create.js.erb 
$("#new_review").before('<div id="flash_notice"><%= escape_javascript(flash.delete(:notice)) %></div>'); 
$("#reviews_count").html("<%= pluralize(@review.product.reviews.count, 'Review') %>"); 
$("#reviews").append("<%= escape_javascript(render(:partial => @review)) %>"); 
$("#new_review")[0].reset(); 

Où êtes-vous stockez votre Javascript? Avez-vous un Application.js dans lequel vous gardez les choses? Si oui, incluez-vous "dojo" avant "application" dans votre javascript_include_tag?

1

Essayez ce qui suit;

class FooController < ApplicationController 
    layout 'foo' 
    def bar 
    respond_to do |format| 
     format.html 
     format.js { render :layout => false } 
    end 
    end 
end 

Espérons que ça aide.

J.K.

Questions connexes