سؤال

أنا أحاول أن تولد استجابة 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.json.erb.يمر :format => 'html' لا يساعد.

هل كانت مفيدة؟

المحلول 5

وبناء على roninek ل استجابة ، لقد وجدت الحل الأمثل لتكون على النحو التالي:

وفي /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 %>

وحل بديل سيكون لإعادة تعريف render لقبول المعلمة :format.

لم أستطع الحصول على render :file للعمل مع السكان المحليين ودون بعض wonkiness المسار.

نصائح أخرى

بداية مع القضبان 3.2.3، عندما دعا تقديم: جزئية (يعمل فقط خارج كتلة respond_to).

:formats => [:html]

وبدلا من

:format => 'html'

ما هو الخطأ مع

render :partial => '/foo/baz.html.erb'

?لقد حاولت هذه لتقديم HTML إرب جزئية من داخل ذرة منشئ قالب وانها عملت بشكل جيد.لا تعبث مع المتغيرات العالمية المطلوبة (نعم, أنا أعرف أن لديهم "@" أمامهم, ولكن هذا ما هم).

الخاص بك with_format &block النهج هو بارد على الرغم من لديه ميزة أنه يمكنك فقط تحديد شكل ، في حين أن مقاربة بسيطة يحدد قالب المحرك (ERB/البناء/الخ) كذلك.

لالقضبان 3، ويعمل كتلة with_format، لكنها مختلفة قليلا:

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

والقضبان 4 تسمح لك لتمرير معلمة الأشكال. حتى تتمكن من القيام

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

ملاحظة يمكنك أن تفعل شيئا مشابها في القضبان 3 كنه لن يمر هذا الشكل إلى أي جزئيات فرعية (إذا كان شكل يدعو جزئيات أخرى).

هل يمكن أن يكون القضبان 4 القدرة في القضبان 3 من خلال خلق التكوين / المهيآت / renderer.rb:

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/

في القضبان 3، وعرض لها صيغ الصفيف، مما يعني أنه يمكنك تعيينها للبحث عن [: أتش تي أم أل: والمتنقلة]. الإعداد الذي سوف الافتراضية إلى: أبحث عن القوالب النقالة، ولكن تراجع إلى: قوالب أتش تي أم أل. وآثار وضع هذا يتدرج إلى جزئيات الداخلية.

وأفضل طريقة، ولكن لا تزال معيبة، التي يمكن أن تجد لوضع هذا كان لوضع هذا الخط في الجزء العلوي من كل قالب الكامل المحمول (ولكن ليس جزئيات).

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

والعيب هو أن لديك لإضافة هذا الخط لقوالب متعددة. إذا كان أي شخص يعرف طريقة لتعيين هذا مرة واحدة، من application_controller.rb، وأنا أحب أن أعرف ذلك. لسوء الحظ، فإنه لا يعمل على إضافة هذا الخط لتخطيط المحمول الخاص بك، ليتم تقديمها في قوالب قبل التخطيط.

مجرد وضع على ما zgchurch كتب:

  • أخذ الاستثناءات في الاعتبار
  • العودة نتيجة يسمى كتلة

يعتقد أنه قد يكون من المفيد.

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

ولديك خياران:

1) استخدام render :file

render :file => "foo/_baz.json.erb"

2) شكل القالب تغيير في HTML من خلال وضعtemplate_format متغير

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

وكان لي ملف اسمه 'المعهد / item.rabl "وكنت أرغب في جعله من وجهة نظر HTML لذلك اضطررت لاستخدام:

وrender file: 'api/item', formats: [:json]

و(file لأن الملف ليس لديهم تسطير في الاسم، formats وليس format (ويمر ومجموعة))

ويبدو أن تمرير خيار formats سيجعل بشكل صحيح في أحدث نسخة القضبان، ما لا يقل عن 3.2:

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

وجئت عبر هذا الموضوع عندما كنت أحاول أن بإبداء XML جزئي في عرض ملف xml.builder آخر. فيما يلي طريقة لطيفة للقيام بذلك

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

ونعم ... اسم ملف كامل يعمل هنا كذلك ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top