Angenommen, Sie befinden sich in Ihrem Benutzer-Controller und möchten eine JSON-Antwort für eine Show-Anfrage erhalten. Es wäre schön, wenn Sie eine Datei in Ihren Ansichten / Benutzern / Verzeichnis mit dem Namen show.json und nach Ihren Benutzern # show erstellen könnten Wenn die Aktion abgeschlossen ist, wird die Datei gerendert.
Derzeit müssen Sie Folgendes tun:
def show
@user = User.find( params[:id] )
respond_to do |format|
format.html
format.json{
render :json => @user.to_json
}
end
end
Aber es wäre schön, wenn Sie einfach eine show.json-Datei erstellen könnten, die automatisch so gerendert wird:
def show
@user = User.find( params[:id] )
respond_to do |format|
format.html
format.json
end
end
Dies würde mir jede Menge Kummer ersparen und das schrecklich schmutzige Gefühl wegwaschen, das ich bekomme, wenn ich meinen JSON im Controller rendere
format.json
mit einershow.json.erb
Datei aufrufen . Siehe meine Antwort.Antworten:
Sie sollten in Ihrem
respond_to
Block in der Lage sein, Folgendes zu tun :Dadurch wird die Vorlage in gerendert
app/views/users/_show.json.erb
.quelle
Versuchen Sie, eine Ansicht hinzuzufügen.
users/show.json.erb
Diese sollte gerendert werden, wenn Sie eine Anfrage für das JSON-Format stellen, und Sie erhalten den zusätzlichen Vorteil, dass es auch von erb gerendert wird, sodass Ihre Datei ungefähr so aussehen könntequelle
@user.first_name.to_json
statt verwendenescape_javascript
. Es gibt einige subtile Unterschiede zwischen dem, was JS erlaubt und dem, was streng JSON ist. (Und diese Unterschiede werden immer wichtiger, wenn Browser ihre eigenen JSON-Parser implementieren.)<%= xyz.to_json %>
sonst bleiben Ihnen zusätzliche Anführungszeichen.Wie andere bereits erwähnt haben, benötigen Sie eine Benutzer- / show.json-Ansicht, es gibt jedoch Optionen, die für die Vorlagensprache berücksichtigt werden müssen ...
ERB
Funktioniert sofort. Großartig für HTML, aber Sie werden schnell feststellen, dass es für JSON schrecklich ist.
RABL
Gute Lösung. Müssen eine Abhängigkeit hinzufügen und ihre DSL lernen.
JSON Builder
Gleiches Angebot wie RABL: Gute Lösung. Müssen eine Abhängigkeit hinzufügen und ihre DSL lernen.
Einfacher Rubin
Ruby ist großartig darin, JSON zu generieren, und es gibt nichts Neues zu lernen, da Sie
to_json
einen Hash oder ein AR-Objekt aufrufen können . Registrieren Sie einfach die Erweiterung .rb für Vorlagen (in einem Initialisierer):Erstellen Sie dann die Ansicht users / show.json.rb:
Weitere Informationen zu diesem Ansatz finden Sie unter http://railscasts.com/episodes/379-template-handlers
quelle
RABL ist wahrscheinlich die schönste Lösung dafür, die ich gesehen habe, wenn Sie nach einer saubereren Alternative zur ERb-Syntax suchen. json_builder und argonaut, die andere Lösungen sind, scheinen beide etwas veraltet zu sein und funktionieren ohne Patches nicht mit Rails 3.1.
RABL ist über ein Juwel erhältlich oder Sie können das GitHub-Repository überprüfen. gute Beispiele auch
https://github.com/nesquena/rabl
quelle
Nur um diese Antwort für andere zu aktualisieren, die zufällig auf dieser Seite landen.
In Rails 3 müssen Sie nur eine Datei unter erstellen
views/users/show.json.erb
. Das@user
Objekt steht der Ansicht zur Verfügung (genau wie bei HTML). Sie benötigen es nicht einmalto_json
mehr.Zusammenfassend ist es nur
und
quelle
respond_with @user, only: [:name]
. Weitere Informationen finden Sie in diesem Tutorial .Fügen Sie einfach eine
show.json.erb
Datei mit dem Inhalt hinzuManchmal ist es nützlich, wenn Sie einige zusätzliche Hilfsmethoden benötigen, die in Controller nicht verfügbar sind, dh
image_path(@user.avatar)
oder etwas, um zusätzliche Eigenschaften in JSON zu generieren:quelle
<%= raw(@user.to_json) %>
zu vermeiden, dass HTML entweicht. Was ich tue, ist, dass ich mich auf to_json verlasse, solange es mir gibt, was ich will, aber wenn ich etwas anderes machen will, schablone ich es mit dem, was normalerweise a ist{ :blah => @user.the_blah }.to_json
.Dies ist möglicherweise eine bessere Option und schneller als ERB: https://github.com/dewski/json_builder
quelle
Ich bin neu bei RoR, das habe ich herausgefunden. Sie können ein JSON-Format direkt rendern
quelle