Rails respond_to blok Objašnjeno
Kada pokrenete svoju prvu Rails aplikaciju, mogli biste pomisliti da su radnje kontrolera sposobne da prikažu samo HTML. Pa zašto i kako koristiti blok respond_to ? Ovde ćemo vam pokazati koliko zgodni blokovi respond_to mogu biti.
respond_to
Prvi korak je stvaranje novog projekta i generisanje scaffolda u Rails-u. Pogledajmo neke od naših radnji kontrolera.
def index
@blogs = Blog.all
end
Kao što vidite, index
akcija nema respond_to
blok. Dakle, ovo će funkcionisati samo prilikom prikazivanja HTML-a. Ali šta ako, međutim, klijent zatraži da dobije stranicu u TEKST formatu? To će dovesti do izuzetka :
ActionView::MissingTemplate (Missing template blogs/index ... with { ... :formats=>[:text], ...})
Rails prolazi kroz registrovane formate i u zahtevu pokušava da pronađe kompatibilni format za MIME tip . Ako nema obrađivača, pokrenuće se greška. Krediti do maks .
Umesto da našim klijentima kažemo da datoteka nedostaje , želimo da im kažemo da format zahteva nije podržan . Možete dodati respond_to
blok svojoj index
radnji:
def index
@blogs = Blog.all
respond_to do |format|
format.html # index.html
format.js # index.js
format.xml { render xml: @blogs }
end
end
Nakon promene, klijent će dobiti 406 error
kada format nije podržan. Takođe, vaša index
akcija će odgovoriti na dva nova formata: js i xml.
Ako vam je potreban jednostavan i brz način da prikažete svoje objekte, možete da koristite ovu prečicu , ona funkcioniše na isti način kao i gornji primer:
def index
@blogs = Blog.all
respond_to :html, :json, :xml
end
Niste sigurni da li ovo zaista funkcioniše? Nastavite i testirajte ga koristeći RSpec i FactoryBot !
Odgovor na isti format
Bilo bi lepo kada biste mogli da imate respond_to
koji bi uticao na čitav kontroler. Obično svaka radnja u vašem kontroleru može raditi sa istim formatima, a to možete postići korišćenjem respond_with
. Evo primera kako to primeniti:
class BlogController < ApplicationController
respond_to :html, :json, :xml
# GET /blogs
# GET /blogs.json
# GET /blogs.xml
def index
@blogs = Blog.all
respond_with(@blogs)
end
end
Ako vam je potrebna veća kontrola i želite da imate nekoliko radnji koje se ponašaju drugačije, uvek možete da upotrebite puni blok respond_to.
U Rails 4.2 respond_with
više nije uključen. Ali možete ga dobiti nazad ako instalirate gem za odgovor . Jednom kada ga instalirate i generišete Rails scaffold , generator će stvoriti kontrolere koristeći respond_with
umesto respond_to
.
class BlogController < ApplicationController
before_action :set_blog, only: [:show, :edit, :update, :destroy]
respond_to :html, :json
def index
@blogs = Blog.all
respond_with(@blogs)
end
...
end
Formatirati SVE ili BILO KOJI?
Ako želite da navedete respond_to
da prikazuje nešto za sve formate, a da ostale opcije ostanu netaknute, uvek možete da koristite format.all na sledeći način:
respond_to do |format|
format.csv { render_csv }
format.all { render_404 }
end
Koristite format.any ako želite da navedete zajednički blok različitih formata:
def index
@blogs = Blog.all
respond_to do |format|
format.html
format.any(:xml, :json) {
render request.format.to_sym @blogs
}
end
end
Sve radnje kontrolera treba testirati kako bi se osiguralo da rade kako je predviđeno!
Definisanje prilagođenog MIME tipa
Ako trebate da koristite MIME tip koji nije podrazumevano podržan, možete da registrujete svoje rukovaoce u config/initializers/mime_types.rb
:
Mime::Type.register "text/markdown", :markdown
To je sve za ovaj članak! Hvala vam na vremenu za čitanje!
Obavezno se pretplatite na naš bilten, odgovorićemo_sa(respond_to) još mnogo budućih članaka!