respond_to do |format|...end, já rodando no handler de 404 deste app

Prévia grátis 3 min de leitura

Uma rota casada, mais de um formato de resposta

Rotas de recursos aninhados, o curso anterior, seguiu como uma requisição chega a uma ação de controller. Isso é metade do trabalho. Quando uma ação como Admin::Catalog::Lessons::ImagesController#destroy roda, ela precisa decidir o que devolver. Neste app costuma haver mais de uma resposta certa: uma página HTML completa ou um redirect para um navegador navegando direto, um pequeno fragmento Turbo Stream para uma atualização no lugar, às vezes só um código de status. O respond_to do |format| ... end é como uma ação oferece várias dessas e escolhe a que a requisição atual precisa.

O exemplo deste app: ApplicationController#render_not_found

rescue_from ActiveRecord::RecordNotFound, with: :render_not_found

def render_not_found
  respond_to do |format|
    format.html do
      @not_found = not_found_context
      @suggested_courses = Public::NotFoundSuggestionsQuery.call.courses
      render "errors/not_found", status: :not_found
    end
    format.any { head :not_found }
  end
end

Todo ActiveRecord::RecordNotFound levantado neste app, de um slug de curso errado a uma aula que sumiu, termina aqui. O format.html, com um bloco, monta uma página 404 com o tema do app: @not_found, @suggested_courses e uma chamada render completa. O format.any, logo abaixo, pega qualquer outro formato numa linha, head :not_found, sem corpo, sem template e sem busca de view.

O que o respond_to faz com esses dois blocos

O respond_to olha a requisição, decide que formato ela quer (a próxima aula mostra como) e roda só o bloco correspondente. O código-fonte instalado do Rails, action_controller/metal/mime_responds.rb, mostra a regra. Uma requisição que resolve para :html roda o bloco de format.html e nada mais. Uma que resolve para qualquer outra coisa, :json, :turbo_stream ou outro formato, roda o bloco de format.any. Ele nunca roda os dois. Se o formato resolvido não casa com nenhum bloco e não há format.any para pegá-lo, o Rails levanta ActionController::UnknownFormat.

O que este curso cobre

Sete aulas, com todo controller citado do código deste app. A aula 2 trata de como o formato de uma requisição é decidido, lido no mime_negotiation.rb instalado do Rails. A aula 3 trata da forma curta, sem bloco, que o covers_controller.rb deste app usa ao lado da forma com bloco explícito. A aula 4 trata do format.any e do seu alias format.all, como o código do Rails os define. A aula 5 trata de uma ação, comments_controller.rb#create, que separa sucesso e falha de jeitos diferentes dentro de cada bloco de formato. A aula 6 trata da rota deste app que força um formato antes de qualquer negociação. A aula 7 mostra como três padrões de tratar formato, todos em uso neste app, somam uma decisão só.

Aula 1 de 7 · grátis

Continue com a aula 2

Como o formato é escolhido, no código instalado do Rails

A ordem que o Rails usa para escolher o formato: parâmetro format, cabeçalho Accept, extensão, XHR e HTML.

Com uma conta grátis você também tem os quizzes, seu progresso e suas anotações, e a discussão.

Digite para buscar...