Jest to blok kodu Ruby, który korzysta z metody pomocniczej Rails. Jeśli nie znasz jeszcze bloków, zobaczysz je bardzo często w Ruby.
respond_to
jest metodą pomocniczą Rails, która jest dołączona do klasy Controller (a raczej jej superklasy). Odnosi się do odpowiedzi, która zostanie wysłana do Widoku (który przechodzi do przeglądarki).
Blok w twoim przykładzie to formatowanie danych - poprzez przekazanie parametru „format” w bloku - wysyłanego z kontrolera do widoku, ilekroć przeglądarka wysyła żądanie danych HTML lub JSON.
Jeśli korzystasz z komputera lokalnego i masz skonfigurowane rusztowanie Post, możesz przejść do, http://localhost:3000/posts
a zobaczysz wszystkie swoje posty w formacie HTML. Ale jeśli wpiszesz http://localhost:3000/posts.json
to:, zobaczysz wszystkie swoje posty w obiekcie json wysłanym z serwera.
Jest to bardzo przydatne do tworzenia ciężkich aplikacji javascript, które muszą przesyłać json tam iz powrotem z serwera. Jeśli chcesz, możesz łatwo utworzyć interfejs json api na zapleczu szyn i przekazać tylko jeden widok - na przykład widok indeksu kontrolera Post. Następnie możesz użyć biblioteki javascript, takiej jak Jquery lub Backbone (lub obie), aby manipulować danymi i utworzyć własny interfejs. Są to tak zwane asynchroniczne interfejsy użytkownika i stają się bardzo popularne (Gmail jest jednym z nich). Są bardzo szybkie i zapewniają użytkownikowi końcowemu bardziej wrażenia z korzystania z komputera w Internecie. Oczywiście jest to tylko jedna zaleta formatowania danych.
Sposób pisania w Rails 3 byłby następujący:
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
Umieszczając respond_to :html, :xml, :json
na szczycie klasy, możesz zadeklarować wszystkie formaty, które kontroler ma wysyłać do twoich widoków.
Następnie w metodzie kontrolera wszystko, co musisz zrobić, to odpowiedz_z (@wszystko_obiektywem_masz)
To tylko upraszcza twój kod nieco bardziej niż to, co Rails generuje automatycznie.
Jeśli chcesz wiedzieć o wewnętrznym funkcjonowaniu tego ...
Z tego, co rozumiem, Railsy introspekują obiekty, aby ustalić, jaki będzie rzeczywisty format. Wartość zmiennych „format” opiera się na tej introspekcji. Szyny mogą wiele zrobić z odrobiną informacji. Byłbyś zaskoczony, jak daleko posunie się prosty @post lub: post.
Na przykład, jeśli mam plik częściowy _user.html.erb, który wyglądałby tak:
_user.html.erb
<li>
<%= link_to user.name, user %>
</li>
Wtedy to samo w moim widoku indeksu dałoby Railsom informację, że trzeba znaleźć częściowe „użytkowników” i iterować przez wszystkie obiekty „użytkowników”:
index.html.erb
<ul class="users">
<%= render @users %>
</ul>
poinformuje Railsów, że musi znaleźć częściowe „użytkownika” i iterować przez wszystkie obiekty „użytkowników”:
Ten post może być przydatny: http://archives.ryandaigle.com/articles/2009/8/6/what-s-new-in-edge-rails-cleaner-restful-controllers-w-respond_with
Możesz także przejrzeć źródło: https://github.com/rails/rails