2008-11-18 22 views
14

Tôi có một FooController rằng phản ứng với HTML và (AJAX) truy vấn JS:Làm cách nào để đưa HTML vào phản hồi 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 

Các mẫu để hỗ trợ nó:

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

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

Và một mẫu AJAX trong đó tôi muốn vẽ lại một phần:

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

Nếu mẫu JS chỉ có JS cũ trong nó (như alert('hi');), nó sử dụng mẫu JS của tôi. Khi tôi đưa vào render (: partial), mặc dù, nó làm cho toàn bộ phản hồi sử dụng mẫu HTML, điều đó có nghĩa là nó không còn hợp lệ JS nữa.

Một giải pháp khả thi là sử dụng một chức năng cho cách bố trí:

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

Nhưng phiên bản của tôi nên công việc! Tại sao không?

+0

Tôi nghĩ lý do nó không hoạt động là một lỗi nhỏ: Tôi có mẫu .json.erb, nhưng không có .js.erb và không có .erb. –

Trả lời

7

Gần đây nhất Railscast covers this topic (using jQuery).

Tôi không hoàn toàn nhìn thấy nơi bạn có thể đi sai, nhưng đây là một snippit từ railscast rằng làm việc tốt để làm cho một phần:

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

đâu bạn lưu trữ Javascript của bạn? Bạn có một Application.js mà bạn đang giữ mọi thứ? Nếu vậy, bạn có bao gồm "dojo" trước "ứng dụng" trong javascript_include_tag của mình không?

1

Hãy thử cách sau;

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

Hy vọng điều đó sẽ hữu ích.

J.K.

Các vấn đề liên quan