2008-11-18 24 views
14

我有一個響應HTML和JS(AJAX)查詢一個FooController的:如何在JS Rails響應中包含HTML?

# 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 

模板來支持它:

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

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

並在其中我想渲染部分的AJAX模板:

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

如果JS模板只具有普通的老JS在它(如alert('hi');),它使用了我的JS模板。但是,當我放入render(:partial)時,它會使整個響應使用HTML模板,這意味着它不再有效的JS。

一個可能的解決方案是使用一個功能佈局:

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

但我的版本應該工作!爲什麼不呢?

+0

我認爲它沒有工作的原因是一個小錯誤:我有一個.json.erb模板,但沒有.js.erb一個,沒有默認的.erb之一。 – 2008-12-08 16:38:10

回答

7

最新的Railscast covers this topic (using jQuery)

我不太看到這裏你可能是想錯了,但這裏的從Railscast一個的這段是工作得很好,以使部分:

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

你在哪裏保存你的Javascript?你有一個Application.js,你正在保存的東西?如果是這樣,你的javascript_include_tag中的「application」之前是否包含「dojo」?

1

請嘗試以下操作;

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

希望有所幫助。

J.K.