Dies ist ein Block von Ruby-Code, der eine Rails-Hilfsmethode nutzt. Wenn Sie mit Blöcken noch nicht vertraut sind, werden Sie sie in Ruby häufig sehen.
respond_to
ist eine Rails-Hilfsmethode, die an die Controller-Klasse (oder besser gesagt an ihre Superklasse) angehängt ist. Es bezieht sich auf die Antwort, die an die Ansicht gesendet wird (die an den Browser gesendet wird).
Der Block in Ihrem Beispiel formatiert Daten - indem Sie einen 'Format'-Parameter im Block übergeben -, die vom Controller an die Ansicht gesendet werden, wenn ein Browser eine Anfrage nach HTML- oder JSON-Daten stellt.
Wenn Sie sich auf Ihrem lokalen Computer befinden und Ihr Post-Gerüst eingerichtet haben, können Sie zu gehen http://localhost:3000/posts
und alle Ihre Posts im HTML-Format sehen. Wenn Sie jedoch http://localhost:3000/posts.json
Folgendes eingeben::, werden alle Ihre Beiträge in einem vom Server gesendeten JSON-Objekt angezeigt.
Dies ist sehr praktisch, um Javascript-schwere Anwendungen zu erstellen, die json vom Server hin und her übertragen müssen. Wenn Sie möchten, können Sie problemlos eine JSON-API auf Ihrem Rails-Backend erstellen und nur eine Ansicht übergeben - wie die Indexansicht Ihres Post-Controllers. Dann könnten Sie eine Javascript-Bibliothek wie Jquery oder Backbone (oder beides) verwenden, um Daten zu bearbeiten und Ihre eigene Schnittstelle zu erstellen. Diese werden als asynchrone Benutzeroberflächen bezeichnet und erfreuen sich großer Beliebtheit (Google Mail ist eine davon). Sie sind sehr schnell und bieten dem Endbenutzer eine Desktop-ähnliche Erfahrung im Web. Dies ist natürlich nur ein Vorteil der Formatierung Ihrer Daten.
Die Rails 3-Schreibweise wäre folgende:
class PostsController < ApplicationController
# GET /posts
# GET /posts.xml
respond_to :html, :xml, :json
def index
@posts = Post.all
respond_with(@posts)
end
#
# All your other REST methods
#
end
Indem Sie respond_to :html, :xml, :json
an die Spitze der Klasse setzen, können Sie alle Formate deklarieren, die Ihr Controller an Ihre Ansichten senden soll.
In der Controller-Methode müssen Sie dann nur noch mit (@whatever_object_you_have) antworten.
Es vereinfacht Ihren Code nur ein wenig mehr als das, was Rails automatisch generiert.
Wenn Sie mehr über das Innenleben wissen wollen ...
Soweit ich weiß, überprüft Rails die Objekte, um das tatsächliche Format zu bestimmen. Der Wert der 'Format'-Variablen basiert auf dieser Selbstbeobachtung. Schienen können mit ein paar Informationen eine ganze Menge tun. Sie wären überrascht, wie weit ein einfacher @post oder: post gehen wird.
Wenn ich zum Beispiel eine _user.html.erb-Teildatei hätte, die so aussieht:
_user.html.erb
<li>
<%= link_to user.name, user %>
</li>
Dann würde dies allein in meiner Indexansicht Rails wissen lassen, dass es notwendig ist, die "Benutzer" teilweise zu finden und alle "Benutzer" -Objekte zu durchlaufen:
index.html.erb
<ul class="users">
<%= render @users %>
</ul>
würde Rails wissen lassen, dass es notwendig ist, den 'Benutzer'-Teil zu finden und alle' Benutzer'-Objekte zu durchlaufen:
Sie können diesen Blog-Beitrag nützlich finden: http://archives.ryandaigle.com/articles/2009/8/6/what-s-new-in-edge-rails-cleaner-restful-controllers-w-respond_with
Sie können auch die Quelle lesen: https://github.com/rails/rails