Marcio Trindade

Rails 5 - redirect_back

Com a chega do Rails 5 se aproximando vamos ver uma das muitas novidades que estão por vir.

Estou falando do método redirect_back que nos permite redirecionar o usuário para a URL anterior, você deve estar pensando "Nossa mas já havia isso no Rails 4, por que é novidade?" Pois bem a grande diferença é como isso funciona.

Para redirecionar para o URL anterior a mesma precise estar no request.headers["Referer"] por que se não houver uma exception do tipo ActionController::RedirectBackError é lançada, então nós tinhamos que tratar isso no nosso código. Veja exemplo abaixo.

ruby
class UsersController < ApplicationController
  rescue_from ActionController::RedirectBackError, with: :redirect_to_default

  def create
    @user = User.new(user_params)
    if @user.save
      redirect_to :back
    else
      render :new
    end
  end

  private

  def redirect_to_default
    redirect_to users_path
  end
end

Então através deste pull request o método abaixo foi adicionado no core do Rails e virá junto com o lançamento do Rails 5.

ruby
def redirect_back(fallback_location:, **args)
  if referer = request.headers["Referer"]
    redirect_to referer, **args
  else
    redirect_to fallback_location, **args
  end
end

Agora o mesmo código do primeiro exemplo deve ser refatorado por que o método redirect_to :back vai lançar um deprecated warning. Então veja com o código ficará.

ruby
class UsersController < ApplicationController
  def create
    @user = User.new(user_params)
    if @user.save
      redirect_back(fallback_location: users_path)
    else
      render :new
    end
  end
end