Ich versuche, eine JSON-Antwort zu generieren, die HTML enthält. So habe ich /app/views/foo/bar.json.erb
:
{
someKey: 'some value',
someHTML: "<%= h render(:partial => '/foo/baz') -%>"
}
Ich möchte, dass es gerendert wird /app/views/foo/_baz.html.erb
, aber es wird nur gerendert /app/views/foo/_baz.json.erb
. Übergeben :format => 'html'
hilft nicht.
ruby-on-rails
format
render
partial
actionview
James A. Rosen
quelle
quelle
Antworten:
Beginnend mit Rails 3.2.3 beim Aufrufen von render: teilweise (funktioniert nur außerhalb des
respond_to
Blocks).anstatt
quelle
:format
Option dies tun würde Arbeit. Vielen Dank!:content_type
in einigen Fällen möglicherweise auch die Option angeben müssen - z. B. kann das Rendern einer HTML-Vorlage innerhalb einesformat.pdf
Blocks nur ausgeführt werdenrender "template", formats: [:html], content_type: "text/html"
. Ich brauche dies, weil ich das direkte Herunterladen von Mustern meiner Bücher nur für Mitglieder meiner E-Mail-Liste erlaube - regelmäßige Besucher erhalten stattdessen ein Anmeldeformular.Was ist falsch mit
? Ich habe gerade versucht, einen HTML-ERB-Teil aus einer Atom-Builder-Vorlage heraus zu rendern, und es hat gut funktioniert. Es ist kein Herumspielen mit globalen Variablen erforderlich (ja, ich weiß, dass sie "@" vor sich haben, aber genau das sind sie).
Ihr
with_format &block
Ansatz ist jedoch cool und hat den Vorteil, dass Sie nur das Format angeben, während der einfache Ansatz auch die Vorlagen-Engine (ERB / builder / etc) angibt.quelle
baz.en.html.erb
,baz.fr.html.erb
) , und Sie wollenrender :partial
s Logik für die richtige Wahl (mit Fallbacks, etc).DEPRECATION WARNING: Passing a template handler in the template name is deprecated. You can simply remove the handler name or pass render :handlers => [:erb] instead.
foo.baz.html.[your_string]
stattfoo.baz.[your_string]
. Die Antwort von zgchurc ist eine bessere Lösung.Für Rails 3 funktioniert der with_format-Block, ist aber etwas anders:
quelle
Mit Rails 4 können Sie einen Formatparameter übergeben. So können Sie tun
Beachten Sie, dass Sie in Rails 3 etwas Ähnliches tun können, dieses Format jedoch nicht an Subpartials übergeben wird (wenn das Formular andere Partials aufruft).
Sie können die Rails 4-Funktion in Rails 3 verwenden, indem Sie config / initializers / renderer.rb erstellen:
Siehe http://railsguides.net/2012/08/29/rails3-does-not-render-partial-for-specific-format/
quelle
Aufbauend auf Ronineks Antwort habe ich die beste Lösung gefunden:
in /app/helpers/application.rb:
In /app/views/foo/bar.json:
Eine alternative Lösung wäre die Neudefinition
render
, um einen:format
Parameter zu akzeptieren .Ich konnte nicht
render :file
mit Einheimischen arbeiten und ohne ein bisschen Wonkiness.quelle
In Rails 3 verfügt die Ansicht über ein Formatarray. Dies bedeutet, dass Sie festlegen können, dass nach [: mobile ,: html] gesucht wird. Bei dieser Einstellung wird standardmäßig nach: mobilen Vorlagen gesucht, aber auf: HTML-Vorlagen zurückgegriffen. Die Auswirkungen dieser Einstellung werden in innere Teilbereiche übergehen.
Der beste, aber immer noch fehlerhafte Weg, den ich finden konnte, um dies festzulegen, bestand darin, diese Zeile oben auf jeder vollständigen mobilen Vorlage (aber nicht auf Teilvorlagen) zu setzen.
Der Fehler ist, dass Sie diese Zeile mehreren Vorlagen hinzufügen müssen. Wenn jemand aus application_controller.rb eine Möglichkeit kennt, dies einmal festzulegen, würde ich es gerne wissen. Leider funktioniert es nicht, diese Zeile zu Ihrem mobilen Layout hinzuzufügen, da die Vorlagen vor dem Layout gerendert werden.
quelle
Ich erläutere nur, was zgchurch geschrieben hat:
Ich dachte, es könnte nützlich sein.
quelle
Sie haben zwei Möglichkeiten:
1) verwenden
render :file
2) Ändern Sie das Vorlagenformat in HTML, indem Sie die Variable @template_format festlegen
quelle
Ich hatte eine Datei mit dem Namen 'api / item.rabl' und wollte sie aus einer HTML-Ansicht rendern, also musste ich Folgendes verwenden:
render file: 'api/item', formats: [:json]
(
file
weil die Datei keinen Unterstrich im Namen hatformats
und nichtformat
(und Pässe und Array))quelle
Es scheint, dass das Übergeben einer
formats
Option diese in der neueren Rails-Version, mindestens 3.2, ordnungsgemäß wiedergibt:quelle
Ich bin auf diesen Thread gestoßen, als ich versucht habe, einen XML-Teil in einer anderen xml.builder-Ansichtsdatei zu rendern. Das Folgende ist ein guter Weg, um es zu tun
Und ja ... Der vollständige Dateiname funktioniert auch hier ...
quelle