Базовая страница ошибки Rails 404

Я искал простой ответ на этот вопрос в течение смехотворно долгого времени, и кажется, что это должно быть настолько очевидным и простым, потому что ни у кого нет простого учебника, защищающего от идиотов.

В любом случае, все, что я хочу сделать, это иметь одну статическую страницу 404.html, которая загружается всякий раз, когда выдается ЛЮБАЯ ошибка. В идеале это должно происходить только в продакшне и постановке.

Я чувствую, что это должно быть проще всего сделать... но я не могу понять это.

Любая помощь горячо приветствуется.


person chrishomer    schedule 19.09.2009    source источник
comment
Хороший вопрос @chishomer, я дал лучший ответ. Проверь это. stackoverflow.com/questions/1447627 /basic-rails-404-error-page/   -  person Manish Shrivastava    schedule 27.03.2014


Ответы (6)


в вашем ApplicationController

unless  ActionController::Base.consider_all_requests_local
  rescue_from Exception, :with => :render_404
end

private

  def render_404
    render :template => 'error_pages/404', :layout => false, :status => :not_found
  end

теперь настройте error_pages/404.html и готово

... или, может быть, я слишком осторожен с Exception, и вместо этого вам следует спасти от RuntimeError.

person Leonid Shevtsov    schedule 19.09.2009
comment
Спасибо за ответ, я также хотел добавить, что я нашел подробную статью по этой теме perfectline.co.uk/blog/ - person Schneems; 16.01.2010
comment
это должно работать, хотя в документации сказано, что вы должны использовать Rails.application.config.consider_all_requests_local вместо ActionController::Base.consider_all_requests_local. - person Leonid Shevtsov; 16.02.2011
comment
Любые ошибки в вашем приложении теперь будут возвращать 404, а не 500, как это правильно... И ошибки маршрутизации не будут спасены, см. rails.lighthouseapp.com/projects/8994/tickets/ Хотя я думаю, что это то, о чем он просил, хотя на самом деле этого делать не следует :) Я использую правило nginx, чтобы выдать 404 для всего, что в /images не может быть найдено. - person Kevin; 28.04.2011
comment
Что я должен указать в файле маршрута? - person nourza; 20.12.2018

Я считаю, что если вы работаете в производственном режиме, то 404.html в общедоступном каталоге будет обслуживаться всякий раз, когда для URL-адреса нет маршрутов.

person Sophie Alpert    schedule 19.09.2009

Если вы работаете в производственном режиме, файлы 404.html, 500.html, 422.html в общедоступном каталоге обслуживаются всякий раз, когда возникает соответствующая ошибка, будут показаны страницы сверху.

В рельсах 3.1

Мы можем использовать, как показано ниже: Rails 3.1 автоматически сгенерирует ответ с правильным кодом состояния HTTP (в большинстве случаев это 200 OK). Вы можете использовать опцию :status, чтобы изменить это:

рендер: статус => 500

рендер :статус =› :запрещено

Rails understands both numeric and symbolic status codes.

Дополнительную информацию см. на этой странице

Ваше здоровье!

person Manish Shrivastava    schedule 24.01.2012

Вы не получите 404 всякий раз, когда возникает какая-либо ошибка, потому что не все ошибки приводят к 404-м. Вот почему в вашем общедоступном каталоге есть страницы 404, 422 и 500. Я предполагаю, что рельсы считают это наиболее распространенными ошибками. Как сказал Бен, 404 появится, когда не сможет что-то найти, 500, когда приложение выдаст ошибку. Между ними вы можете покрыть множество своих баз.

person theIV    schedule 19.09.2009

Вот как я это делаю. В моем application_controller.rb:

def render_404
  render file: 'public/404.html', layout: false, status: :not_found
end

Затем в любом контроллере, где я хочу отобразить ошибку 404, я делаю что-то вроде этого:

@appointment = Appointment.find_by(id: params[:appointment_id]) || render_404
person Jason Swett    schedule 22.01.2020

Другой способ сделать это — настроить config/application.rb следующим образом:

module YourApp
  class Application < Rails::Application
    # ...

    config.action_dispatch.rescue_responses.merge!(
      'MyCustomException' => :not_found
    )
  end
end

Так что всякий раз, когда поднимается MyCustomException, Rails обрабатывает его как обычный :not_found, отображая public/404.html.

Чтобы проверить это локально, убедитесь, что вы изменили config/environments/development.rb на:

config.consider_all_requests_local = false

Подробнее о config.action_dispatch.rescue_responses.

person Bruno Buccolo    schedule 18.05.2015