Как мне отобразить часть другого формата в 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 111

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

и да... Полное имя файла работает и здесь...