كيف تجعل جزء من شكل مختلف في القضبان ؟
-
19-08-2019 - |
سؤال
أنا أحاول أن تولد استجابة 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
ونعم ... اسم ملف كامل يعمل هنا كذلك ...