120

HTMLを含むJSON応答を生成しようとしています。したがって、私は持っています/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'しても役に立ちません。

4

11 に答える 11

105

Rails 3.2.3 以降、render :partial を呼び出すとき (respond_toブロックの外側でのみ機能します)。

render formats: [ :html ]

それ以外の

render format: 'html'
于 2012-02-19T05:27:23.753 に答える
64

どうしたの

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

? Atomビルダーテンプレート内からHTML ERBパーシャルをレンダリングするためにこれを試したところ、うまくいきました. グローバル変数をいじる必要はありません (ええ、それらの前に「@」が付いていることは知っていますが、それがそのようなものです)。

ただし、あなたのwith_format &blockアプローチはクールで、フォーマットのみを指定するという利点がありますが、単純なアプローチではテンプレート エンジン (ERB/builder/etc) も指定します。

于 2008-12-04T13:03:01.093 に答える
34

Rails 4 では、format パラメータを渡すことができます。だからあなたはすることができます

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

Rails 3でも同様のことができますが、その形式はサブパーシャルに渡されないことに注意してください(フォームが他のパーシャルを呼び出す場合)。

config/initializers/renderer.rb を作成することで、Rails 3 で Rails 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/を参照してください。

于 2013-05-15T18:50:19.530 に答える
32

Rails 3 の場合、with_format ブロックは機能しますが、少し異なります。

  def with_format(format, &block)
    old_formats = formats
    self.formats = [format]
    block.call
    self.formats = old_formats
    nil
  end
于 2010-08-06T20:40:26.680 に答える
30

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地元の人たちと一緒に仕事をすることはできませんでした。

于 2008-12-04T12:28:24.237 に答える
25

Rails 3 では、View に format 配列があり、[:mobile, :html] を探すように設定できます。デフォルトで :mobile テンプレートを検索する設定ですが、:html テンプレートにフォールバックします。これを設定する効果は、内側のパーシャルにカスケードします。

これを設定するために私が見つけた最良の、しかしまだ欠陥のある方法は、この行を各完全なモバイル テンプレートの先頭に配置することでした (ただし、部分的なテンプレートではありません)。

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

欠点は、その行を複数のテンプレートに追加する必要があることです。application_controller.rb からこれを一度設定する方法を誰かが知っている場合は、ぜひ知りたいです。残念ながら、テンプレートはレイアウトの前にレンダリングされるため、その行をモバイル レイアウトに追加することはできません。

于 2011-05-30T23:17:55.417 に答える
16

zgchurch が書いたことを詳しく説明すると、次のようになります。

  • 例外を考慮する
  • 呼び出されたブロックの結果を返す

役に立つかもしれないと思った。

def with_format(format, &block)
  old_formats = formats
  begin
    self.formats = [format]
    return block.call
  ensure
    self.formats = old_formats
  end
end
于 2011-02-22T04:49:00.847 に答える
10

2つのオプションがあります。

1)使用render :file

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

2)@template_format変数を設定して、テンプレート形式をhtmlに変更します

<% @template_format = "html" %>
<%= h render(:partial => '/foo/baz') %>
于 2008-12-04T11:54:01.920 に答える
6

「api/item.rabl」という名前のファイルがあり、HTML ビューからレンダリングしたかったので、次を使用する必要がありました。

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

fileファイルの名前にアンダースコアがなく、formatsformatおよびパスと配列)ではないため)

于 2013-10-18T18:57:29.180 に答える
2

オプションを渡すと、formatsRails の新しいバージョン (少なくとも 3.2) で適切にレンダリングされるようです。

{
  someKey: 'some value',
  someHTML: "<%= h render('baz', formats: :html) -%>"
}
于 2012-05-22T07:56:06.860 に答える
1

別の xml.builder ビュー ファイルで XML パーシャルをレンダリングしようとしたときに、このスレッドに遭遇しました。以下はそれを行うための良い方法です

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

そしてええ...ここでも完全なファイル名が機能します...

于 2010-06-23T09:42:39.793 に答える