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/

25voto

Tony Stubblebine Punkte 281

In Rails 3 hat die View ein formats-Array, was bedeutet, dass man sie so einstellen kann, dass sie nach [:mobile, :html] sucht. Wenn Sie das einstellen, wird standardmäßig nach :mobile-Vorlagen gesucht, aber es wird auf :html-Vorlagen zurückgegriffen. Die Auswirkungen dieser Einstellung werden kaskadenförmig in die inneren Teilbereiche übertragen.

Die beste, aber immer noch fehlerhafte Methode, die ich finden konnte, war, diese Zeile am Anfang jeder vollständigen mobilen Vorlage (aber nicht der Teilvorlagen) einzufügen.

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

Der Fehler ist, dass man diese Zeile in mehrere Templates einfügen muss. Wenn jemand eine Möglichkeit kennt, dies einmal zu setzen, von application_controller.rb, würde ich es lieben zu wissen. Leider funktioniert es nicht, diese Zeile zu Ihrem mobilen Layout hinzuzufügen, da die Vorlagen vor dem Layout gerendert werden.

16voto

viphe Punkte 679

Ich führe nur aus, was zgchurch geschrieben hat:

  • Berücksichtigung von Ausnahmen
  • Rückgabe des Ergebnisses des aufgerufenen Blocks

Ich dachte, es könnte nützlich sein.

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

10voto

roninek Punkte 126

Sie haben zwei Möglichkeiten:

1) verwenden render :file

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

2) Ändern Sie das Format der Vorlage in html, indem Sie die Variable @template_format setzen.

<% @template_format = "html" %>
<%= h render(:partial => '/foo/baz') %>

7voto

Dorian Punkte 20663

Ich hatte eine Datei mit dem Namen "api/item.rabl" und wollte sie aus einer HTML-Ansicht heraus rendern, also musste ich sie verwenden:

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

( file weil die Datei keinen Unterstrich im Namen hat, formats und nicht format (und geht und Array))

2voto

Mario Uher Punkte 11989

Es scheint, dass die Übergabe einer formats Option wird in neueren Rails-Versionen, mindestens 3.2, korrekt dargestellt:

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

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