2008-11-18 12 views
14

Mam FooController który reaguje na HTML i JS (Ajax) Zapytania:Jak dołączyć kod HTML do odpowiedzi 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 

Szablony go wspierać:

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

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

i szablon AJAX, w którym chcę, aby uczynić częściowy:

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

Jeśli szablon JS ma tylko zwykły stary JS w nim (jak alert('hi');), używa mój szablon JS. Kiedy wstawiam render (: częściowy), powoduje to, że cała odpowiedź używa szablonu HTML, co oznacza, że ​​nie jest już prawidłowym JS.

Możliwym rozwiązaniem jest użycie funkcji dla układu:

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

Ale moja wersja powinien pracy! Dlaczego nie?

+0

Myślę, że powodem, dla którego to nie zadziałało, był drobny błąd: Miałem szablon .json.erb, ale nie było żadnego .jbera ani domyślnego .erb. –

Odpowiedz

7

Najnowsza wersja Railscast covers this topic (using jQuery).

nie jestem całkiem widząc gdzie może być nie tak, ale tu jest snippit z Railscast że działa dobrze do renderowania częściowy:

// 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(); 

Gdzie jesteś przechowywania JavaScript? Czy masz aplikację Application.js, w której się znajdujesz? Jeśli tak, czy włączysz "dojo" przed "aplikacją" w swoim javascript_include_tag?

1

Spróbuj wykonać następujące czynności;

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

Nadzieję, że pomaga.

J.K.

Powiązane problemy