Rails respond_to blok Objašnjeno

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!