128 Stimmen

Wie rendere ich einen Teil eines anderen Formats in Rails?

Ich versuche, eine JSON-Antwort zu erzeugen, die etwas HTML enthält. Ich habe also /app/views/foo/bar.json.erb :

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

Ich möchte, dass es Folgendes wiedergibt /app/views/foo/_baz.html.erb aber es wird nur Folgendes wiedergeben /app/views/foo/_baz.json.erb . Weitergabe :format => 'html' ist nicht hilfreich.

0 Stimmen

Der Titel der Frage ist viel allgemeiner als das spezielle Problem von James. Wenn Sie nach anderen Lösungen suchen, schauen Sie hier nach: stackoverflow.com/questions/7616097/

108voto

Tim Haines Punkte 1476

Beginnend mit Rails 3.2.3 wird beim Aufruf von render :partial (funktioniert nur außerhalb der respond_to Block).

render formats: [ :html ]

anstelle von

render format: 'html'

0 Stimmen

Ich schätze, dass es je nach Kontext verschiedene "beste" Antworten geben kann, so dass es schwer ist, diese Frage sinnvoll zu bewerten, aber dies erfüllte mein Bedürfnis, eine HTML-Vorlage aus einer RJS-Vorlage desselben Namens einfach zu rendern, nachdem ich gehofft hatte, dass ein :format Option funktionieren würde. Danke!

1 Stimmen

Dies funktioniert auch für Rails 5.0.2. Beachten Sie jedoch, dass Sie möglicherweise auch die :content_type Option in einigen Fällen - z. B. beim Rendern einer HTML-Vorlage aus einer format.pdf Block kann nur mit render "template", formats: [:html], content_type: "text/html" . Ich benötige dies, weil ich den direkten Download von Mustern von meine Bücher nur für Mitglieder meiner E-Mail-Liste - normale Besucher erhalten stattdessen ein Anmeldeformular.

64voto

Sam Stokes Punkte 14381

Was ist falsch an

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

? Ich habe gerade versucht, dies zu einem HTML-ERB-Teil aus einer Atom-Builder-Vorlage zu rendern und es funktionierte gut. Kein Herumhantieren mit globalen Variablen erforderlich (ja, ich weiß, sie haben "@" vor ihnen, aber das ist, was sie sind).

Ihr with_format &block Anfahrt ist allerdings cool und hat den Vorteil, dass Sie nur das Format angeben, während der einfache Ansatz auch die Template-Engine (ERB/Builder/etc) angibt.

40voto

DrewB Punkte 3083

Rails 4 erlaubt die Übergabe eines Formatparameters. Sie können also tun

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

Beachten Sie, dass Sie etwas ähnliches in Rails 3 tun können, aber es würde nicht übergeben, dass das Format auf alle sub partials (wenn Form andere partielle Aufrufe).

Sie können die Rails 4 Fähigkeit in Rails 3 haben, indem Sie config/initializers/renderer.rb erstellen:

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

Siehe http://railsguides.net/2012/08/29/rails3-does-not-render-partial-for-specific-format/

32voto

zgchurch Punkte 2302

Für Rails 3 funktioniert der with_format-Block, aber er ist ein wenig anders:

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

30voto

James A. Rosen Punkte 62226

Aufbauend auf roninek's Antwort Ich habe die beste Lösung gefunden, und zwar wie folgt

in /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

In /app/views/foo/bar.json:

<% with_format('html') do %>
  <%= h render(:partial => '/foo/baz') %>
<% end %>

Eine alternative Lösung wäre eine Neudefinition render zu akzeptieren :format Parameter.

Ich konnte nicht bekommen render :file mit den Einheimischen zu arbeiten, ohne dass der Weg zu weit ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X