2011-03-23 12 views
10

मैं एक json प्रतिक्रिया जिसमें कुछ मूल्य एक आंशिकjson ERB टेम्पलेट अन्य एचटीएमएल आंशिक

#projects_Controller.rb 

def index 
    respond_to do |f| 
    f.json 
    end 
end 

# index.json.erb 

    { 
    "html":"<%= raw escape_javascript(render :partial => 'projects/disclaimer') %>" 
    } 

द्वारा प्रदान की गई एचटीएमएल है के लिए कोशिश कर रहा हूँ नहीं मिल रहा है लेकिन मैं निम्नलिखित त्रुटि मिलती है:

ActionView::Template::Error (Missing partial projects/disclaimer with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml], :formats=> 
    [:json], :locale=>[:en, :en]} in view paths "c:/rails/app/views", "c:/rails/vendor/plugins/more/app/views", "C:/Ruby192/lib/ruby/gems/1.9.1/gems/devise-1.1.8/app/views") 

ऐसा लगता है कि JSON अनुरोध .json.erb के साथ आंशिक रूप से प्रस्तुत करता है लेकिन नहीं .html.erb, जो मेरे पास है। क्या मेरे लिए 'html' निर्दिष्ट करने का कोई तरीका है।

जोड़ा: हैं अनुरोध 'जे एस' है, और index.js.erb में मैं लगभग एक ही कोड प्रस्तुत करना: # index.js.erb

disclaimer = { 
    "html":"<%= raw escape_javascript(render :partial => 'projects/disclaimer') %>" 
    } 

यह परियोजनाओं मिल रहा है/अस्वीकरण .html.erb और इसे सही ढंग से प्रस्तुत करता है। मुझे आश्चर्य है कि उसमें इतनी असंगतता क्यों है कि अगर किसी ने जेएस से अनुरोध किया है, तो उसके टेम्पलेट में कोई आंशिक प्रतिपादन partial_name.html.erb की तलाश करेगा, लेकिन अगर किसी ने जेसन से अनुरोध किया है, तो आंशिक प्रतिपादन partial_name.json.erb के लिए पूछेगा?

धन्यवाद

उत्तर

13

समझ गए: सभी एक की जरूरत है .json.erb फ़ाइल में इस लाइन है <% self.formats = [ "html"]%>

तो पूर्ण index.json.erb

 <% self.formats = ["html"] %> 
     disclaimer = { 
     "html":"<%= raw escape_javascript(render :partial => 'projects/disclaimer', 
        :content_type => 'text/html'), 
        :locals => {:localVariable => @localVariable} 
       %>" 
     } 
+5

यह दृष्टिकोण JSON को प्रतिपादित करने वाले नियंत्रक के अंदर से भी काम करता है; मैंने 'self.formats = [: html]' सेट किया है, फिर 'render_to_string (: partial =>' an_html_partial ',: स्थानीय => {: जो भी => जो कुछ भी}), और फिर मैं जेसन जुर्माना प्रस्तुत कर सकता हूं। – alxndr

+0

यदि आपके पास अन्य जेसन आंशिक भी हैं, तो आप इसके बजाय 'self.formats + = [: html]' करना चाहेंगे। –

0

मुझे यकीन है कि अगर मैं आप का अधिकार मिल गया नहीं कर रहा हूँ, लेकिन शायद आप इस तरह की सामग्री के प्रकार के साथ खेल सकते हैं:

disclaimer = { 
    "html":"<%= raw escape_javascript(render :partial => 'projects/disclaimer', :content_type => 'text/html'), :locals => {:localVariable => @localVariable} %>" 
} 

: स्थानीय लोगों सिर्फ अगर तुम पास करना चाहते है आंशिक के लिए एक var।

+0

नहीं, मुझे लगता है कि आप पैसे पर सही हैं: रेलों को जेसन की सेवा करने के लिए कहा जाता है, इसलिए जो भी कुछ भी करता है, जिसमें कोई भी प्रस्तुतकर्ता शामिल है, उसे json नहीं होना चाहिए html.erb। इसलिए जब मैं प्रतिक्रिया के अंदर partial.html.erb के लिए पूछता हूं, तो यह आंशिक रूप से कहने में त्रुटि उत्पन्न करता है। जेएसओएन.एआरबी नहीं मिला। अजीब बात यह है कि, अगर मैं हेडर में .js (JSONP?) के लिए पूछता हूं, जिसका अर्थ है कि रेल को .js.erb में सभी आंशिक रूप से कार्य करना चाहिए, लेकिन इस बार, यह सेवा नहीं करेगा। Html.erb और नहीं कहेंगे यह नहीं मिला यह मेरे विवाद में एक असंगतता है .... लेकिन जोड़ने के बाद: content_type => 'text/html', यह अभी भी वही त्रुटि फेंकता है –

5

मेरा उत्तर निक के ऊपर जैसा है।

# helpers useful for json.erb templates 
module JsonHelper 

    # Same as render but force actionview to look for html templates instead of json. 
    def render_html(options={}, locals={}, &block) 
    old_formats = formats 
    self.formats = [:html] # hack so partials resolve with html not json format 
    render options, locals, &block 

    ensure 
    self.formats = old_formats 
    end 

    # json escape a string. For example <%=json "some { string }" %> 
    def json(value) 
    raw value.to_json 
    end 
end 

मैं की तरह

{ 
    "html": <%=json render_html(:partial => 'some_partial') %>, 
    "status": success 
} 

यह अच्छे हो सकता है अगर actionview 23tux के उदाहरण की तरह एक content_type साथ प्रतिपादन की अनुमति टेम्पलेट्स लिख सकते हैं तो अब (जो नहीं करता है: मैं json.erb टेम्पलेट्स के लिए निम्नलिखित सहायक है मेरे लिए काम नहीं करते)। यह भी अच्छा होगा अगर केवल * .html.erb सभी * .erb फ़ाइलों के बजाय HTML से बच निकला।

1

भावी पाठकों के लिए, आप इस तरह के प्रारूप पैरामीटर पर जा सकते हैं।

= render partial: 'user', locals: {xyz: @xyz}, :formats => [:html] 
संबंधित मुद्दे