match '*path' => redirect('/'), via: :all if Rails.env.production? прекрасно справляется со всем, но не может должным образом улавливать такие случаи

/root.com/articles/293, где 293 - это идентификатор статьи, которой нет в базе данных.

В этом случае он по-прежнему перенаправляется на страницу 404 по умолчанию, которая на heroku является уродливой страницей «что-то пошло не так».

Как я могу использовать URL-адрес «действительный URL, но недействительный идентификатор ресурса», чтобы управлять его перенаправлением туда, где я хочу?

2
ahnbizcad 24 Фев 2015 в 06:07

2 ответа

Лучший ответ

Ознакомьтесь с rescue_from. Это очень удобно, если вы хотите отклониться от стандартного поведения Rails при отображении страницы 404.

class ApplicationController < ActionController::Base
  rescue_from ActiveRecord::RecordNotFound, with: :record_not_found

  private

  def record_not_found
    # handle redirect
  end
end
4
messanjah 24 Фев 2015 в 05:23

Мне кажется, что это проверка, которую вы бы сделали в своем контроллере. Что-то вроде:

class ArticlesController < ApplicationController

  def show
    id = params[:id]
    if Article.exists?(id)
      #proceed as normal
    else
      #redirect to "Article doesn't exist" page
    end
  end
end

Вы можете создать такой общий метод:

class ApplicationController < ActionController::Base

def redirect_if_does_not_exist
  id = params[:id]
  model_name = controller_name.classify.constantize
  unless model_name.exists?(id)
    # handle redirect
  end
end

Затем вы можете просто вызвать этот метод в обратном вызове before_action на контроллерах, которые вы хотите проверить. Так:

class ArticlesController < ApplicationController
  before_action :redirect_if_does_not_exist
end
0
Joel Brewer 24 Фев 2015 в 04:04