2008-11-18 13 views
14

मैं एक FooController HTML और जे एस (AJAX) प्रश्नों का जवाब है:मैं जेएस रेल प्रतिक्रिया में एचटीएमएल कैसे शामिल करूं?

# 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')) %>"; 

तो जे एस टेम्पलेट बस में सादे पुराने जे एस (जैसे alert('hi');) है, यह मेरी जे एस टेम्पलेट का उपयोग करता है। जब मैं रेंडर (आंशिक) डालता हूं, हालांकि, यह पूरी प्रतिक्रिया HTML टेम्पलेट का उपयोग करता है, जिसका अर्थ है कि यह अब वैध जेएस नहीं है।

सम्भावित समाधान लेआउट के लिए एक समारोह का उपयोग करने के लिए है:

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

लेकिन मेरी संस्करण काम करना चाहिए! ऐसा क्यों नहीं है

+0

मुझे लगता है कि यह काम नहीं करने का कारण एक छोटा बग था: मेरे पास .json.erb टेम्पलेट था, लेकिन नहीं .js.erb एक और कोई डिफ़ॉल्ट नहीं .erb one। –

उत्तर

7

सबसे हालिया Railscast covers this topic (using jQuery)

मैं काफी नहीं दिखाई दे रहा है जहाँ आप गलत हो रहा हो सकता है, लेकिन यहाँ Railscast से एक SNIPPIT कि एक आंशिक रेंडर करने के लिए ठीक काम करता है:

// 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_include_tag में "एप्लिकेशन" से पहले "डोजो" भी शामिल हैं?

1

निम्नलिखित का प्रयास करें;

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

आशा है कि मदद करता है।

जे.के.

संबंधित मुद्दे