ruby on rails - मैं रेल में एक अलग प्रारूप का आंशिक कैसे प्रस्तुत करूं?




ruby-on-rails format (8)

मैं एक JSON प्रतिक्रिया उत्पन्न करने की कोशिश कर रहा हूं जिसमें कुछ HTML शामिल हैं। इस प्रकार, मेरे पास /app/views/foo/bar.json.erb :

{
  someKey: 'some value',
  someHTML: "<%= h render(:partial => '/foo/baz') -%>"
}

मैं इसे /app/views/foo/_baz.html.erb प्रस्तुत करना चाहता /app/views/foo/_baz.html.erb , लेकिन यह केवल /app/views/foo/_baz.json.erb प्रस्तुत /app/views/foo/_baz.json.erb । पासिंग :format => 'html' मदद नहीं करता है।


आपके पास दो विकल्प हैं:

1) रेंडर का उपयोग करें: फ़ाइल => "foo / _baz.json.erb"

2) @template_format चर सेट करके एचटीएमएल में टेम्पलेट प्रारूप बदलें

<% @template_format = "html" %>
<%= h render(:partial => '/foo/baz') %>

ऐसा लगता है कि formats को पास करने से इसे कम से कम 3.2 में नए रेल संस्करण में ठीक से प्रस्तुत किया जाएगा:

{
  someKey: 'some value',
  someHTML: "<%= h render('baz', formats: :html) -%>"
}

जब मैं एक एक्सएमएल आंशिक एक अन्य xml.builder दृश्य फ़ाइल में प्रस्तुत करने की कोशिश कर रहा था, तो मैं इस धागे में आया था। ऐसा करने का एक अच्छा तरीका निम्नलिखित है

xml.items :type => "array" do
    @items.each do |item|
        xml << render(:partial => 'shared/partial.xml.builder', :locals => { :item => item })
    end
end

और हाँ ... पूर्ण फ़ाइल नाम भी यहां काम करता है ...


ज़ेगचर्च ने क्या लिखा है इस पर विस्तार से बताया गया है:

  • खाते में अपवाद लेना
  • बुलाए गए ब्लॉक के परिणाम लौट रहे हैं

सोचा कि यह उपयोगी हो सकता है।

def with_format(format, &block)
  old_formats = formats
  begin
    self.formats = [format]
    return block.call
  ensure
    self.formats = old_formats
  end
end

रेल 3 के लिए, with_format ब्लॉक काम करता है, लेकिन यह थोड़ा अलग है:

  def with_format(format, &block)
    old_formats = formats
    self.formats = [format]
    block.call
    self.formats = old_formats
    nil
  end

रेल 3 में, व्यू में एक प्रारूप सरणी है, जिसका अर्थ है कि आप इसे [: मोबाइल,: html] देखने के लिए सेट कर सकते हैं। यह सेट करने के लिए डिफ़ॉल्ट होगा: मोबाइल टेम्पलेट्स, लेकिन वापस लौटें: एचटीएमएल टेम्पलेट्स। इसे स्थापित करने के प्रभाव आंतरिक आंशिक रूप से नीचे आ जाएंगे।

सबसे अच्छा, लेकिन अभी भी दोषपूर्ण तरीका, जिसे मैं सेट करने के लिए पा सकता था, यह लाइन प्रत्येक पूर्ण मोबाइल टेम्पलेट (लेकिन आंशिक नहीं) के शीर्ष पर रखना था।

<% self.formats = [:mobile, :html] %>

दोष यह है कि आपको उस पंक्ति को कई टेम्पलेट्स में जोड़ना होगा। अगर कोई इसे एप्लिकेशन_controller.rb से एक बार सेट करने का तरीका जानता है, तो मुझे यह जानना अच्छा लगेगा। दुर्भाग्यवश, यह उस लाइन को आपके मोबाइल लेआउट में जोड़ने के लिए काम नहीं करता है, क्योंकि लेआउट को लेआउट से पहले प्रस्तुत किया जाता है।


रेल 4 आपको स्वरूप पैरामीटर पास करने की अनुमति देगा। तो आप कर सकते हैं

render(:partial => 'form', :formats => [:html])} 

ध्यान दें कि आप रेल 3 में कुछ ऐसा ही कर सकते हैं लेकिन यह उस प्रारूप को किसी भी उप आंशिक रूप से पास नहीं करेगा (यदि फॉर्म अन्य आंशिक रूप से कॉल करता है)।

कॉन्फ़िगर / प्रारंभकर्ता / renderer.rb बनाकर आप रेल 3 में रेल 4 की क्षमता प्राप्त कर सकते हैं:

class ActionView::PartialRenderer
  private
  def setup_with_formats(context, options, block)
    formats = Array(options[:formats])
    @lookup_context.formats = formats | @lookup_context.formats
    setup_without_formats(context, options, block)
  end

  alias_method_chain :setup, :formats
end

देखें http://railsguides.net/2012/08/29/rails3-does-not-render-partial-for-specific-format/


रोनेनेक की प्रतिक्रिया पर बिल्डिंग, मुझे निम्नलिखित होने का सबसे अच्छा समाधान मिला है:

/app/helpers/application.rb में:

def with_format(format, &block)
  old_format = @template_format
  @template_format = format
  result = block.call
  @template_format = old_format
  return result
end

/app/views/foo/bar.json में:

<% with_format('html') do %>
  <%= h render(:partial => '/foo/baz') %>
<% end %>

एक वैकल्पिक समाधान एक :format पैरामीटर स्वीकार render लिए render करने के लिए फिर से परिभाषित करना होगा।

मैं render :file नहीं कर सका render :file स्थानीय लोगों के साथ काम करने के लिए render :file और बिना किसी पथ के जीतने के लिए फ़ाइल।







actionview