Как мне отобразить часть другого формата в Rails?
Я пытаюсь создать ответ 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'
не помогает.
11 ответов:
начиная с Rails 3.2.3, при вызове render: частичное использование
:formats => [:html]
вместо
:format => 'html'
что с
render :partial => '/foo/baz.html.erb'
? Я просто попробовал это, чтобы сделать HTML ERB частичным из шаблона Atom builder, и он работал нормально. Не возиться с глобальными переменными требуется (да, я знаю, что у них есть "@" перед ними, но это то, что они есть).
код
with_format &block
подход это круто, хотя и имеет то преимущество, что вы указываете только формат, тогда как простой подход определяет механизм шаблонов (ERB / builder / etc) как что ж.
для Rails 3 блок with_format работает, но он немного отличается:
def with_format(format, &block) old_formats = formats self.formats = [format] block.call self.formats = old_formats nil end
дом на roninek это, Я нашел лучшее решение, чтобы быть следующим:
in/app/helpers / application.РБ:
def with_format(format, &block) old_format = @template_format @template_format = format result = block.call @template_format = old_format return result end
In/app/views/foo / bar.json:
<% with_format('html') do %> <%= h render(:partial => '/foo/baz') %> <% end %>
альтернативным решением было бы переопределить
render
принять
Rails 4 позволит вам передать параметр formats. Так что вы можете сделать
render(:partial => 'form', :formats => [:html])}
Примечание Вы можете сделать что-то подобное в Rails 3, но он не будет передавать этот формат в какие-либо суб-партиалы (если форма вызывает другие партиалы).
Вы можете иметь возможность Rails 4 в Rails 3, создав конфигурацию / инициализаторы / рендерер.РБ:
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/
в Rails 3 представление имеет массив форматов, что означает, что вы можете настроить его на поиск [:mobile,: html]. Настройка, которая по умолчанию будет искать: мобильные шаблоны, но вернется к :HTML-шаблонам. Эффекты установки этого каскада вниз во внутренние частичные числа.
лучший, но все же ошибочный способ, который я мог найти, чтобы установить это, состоял в том, чтобы поместить эту строку в верхней части каждого полного мобильного шаблона (но не частичных).
<% self.formats = [:mobile, :html] %>
недостаток в том, что вы должны добавить, что строка для нескольких шаблонов. Если кто-то знает способ как-то это, от application_controller.РБ, я бы хотел это знать. К сожалению, это не работает, чтобы добавить эту строку в свой мобильный макет, потому что шаблоны отображаются перед макетом.
просто уточняя, что написал згчерч:
- исключения, принимая во внимание
- возврат результата вызванного блока
думал, что это может быть полезно.
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 => "foo/_baz.формат JSON.Эрб"
2) измените формат шаблона на html, установив переменную @template_format
<% @template_format = "html" %> <%= h render(:partial => '/foo/baz') %>
у меня был файл с именем 'api/item.rabl ' и я хотел сделать его из HTML-представления, поэтому мне пришлось использовать:
render file: 'api/item', formats: [:json]
(
file
потому что файл не имеет подчеркивания в имени,formats
, а неformat
(и проходит и массив))
Кажется, что проезжает
formats
опция будет правильно отображать его в новой версии Rails, по крайней мере 3.2:{ someKey: 'some value', someHTML: "<%= h render('baz', formats: :html) -%>" }
я наткнулся на этот поток, когда я пытался сделать XML частичным в другом xml.просмотр файла конструктора. Ниже приведен хороший способ сделать это
xml.items :type => "array" do @items.each do |item| xml << render(:partial => 'shared/partial.xml.builder', :locals => { :item => item }) end end
и да... Полное имя файла работает и здесь...