match '*path' => redirect('/'), via: :all if Rails.env.production?
прекрасно справляется со всем, но не может должным образом улавливать такие случаи
/root.com/articles/293
, где 293 - это идентификатор статьи, которой нет в базе данных.
В этом случае он по-прежнему перенаправляется на страницу 404 по умолчанию, которая на heroku является уродливой страницей «что-то пошло не так».
Как я могу использовать URL-адрес «действительный URL, но недействительный идентификатор ресурса», чтобы управлять его перенаправлением туда, где я хочу?
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
Мне кажется, что это проверка, которую вы бы сделали в своем контроллере. Что-то вроде:
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
Похожие вопросы
Связанные вопросы
Новые вопросы
ruby-on-rails
Ruby on Rails - это полнофункциональная платформа веб-приложений с открытым исходным кодом, написанная на Ruby. Он следует популярной модели фреймворка MVC и известен своим подходом «соглашение поверх конфигурации» при разработке приложений.