update stable software rails official latest ruby-on-rails ruby-on-rails-3 exception-handling error-handling actionview

ruby-on-rails - stable - ruby on rails software



Páginas de error dinámico en Rails 3 (4)

En Rails 2.3.x, puede anular el render_optional_error_file manera:

# ApplicationController.rb protected def render_optional_error_file(status_code) render :template => "errors/500", :status => 500, :layout => ''application'' end

Sin embargo, Rails 3 ya no tiene render_optional_error_file . En su lugar, debes anular rescue_action_in_public , que puedes hacer de esta manera:

# config/initializers/error_page.rb module ActionDispatch class ShowExceptions protected def rescue_action_in_public(exception) status = status_code(exception).to_s template = ActionView::Base.new(["#{Rails.root}/app/views"]) if ["404"].include?(status) file = "/errors/404.html.erb" else file = "/errors/500.html.erb" end body = template.render(:file => file) render(status, body) end end end

Esto funciona, pero no usa el diseño de la aplicación. Sin embargo, si especifica la ruta de diseño así:

body = template.render(:file => file, :layout => "layouts/application") # line 15

Obtiene un Error during failsafe response: ActionView::Template::Error .

La línea 4 de application.html.erb: 4 es:

<%= stylesheet_link_tag "app", "jquery-ui", "jquery.fancybox", :cache => "all" %>

Lo que ActionView normalmente usa para renderizar plantillas no se carga.

El seguimiento de la pila es:

/var/lib/gems/1.8/gems/actionpack-3.0.5/lib/action_view/helpers/asset_tag_helper.rb:794:in `join'' /var/lib/gems/1.8/gems/actionpack-3.0.5/lib/action_view/helpers/asset_tag_helper.rb:794:in `rails_asset_id'' /var/lib/gems/1.8/gems/actionpack-3.0.5/lib/action_view/helpers/asset_tag_helper.rb:817:in `rewrite_asset_path'' /var/lib/gems/1.8/gems/actionpack-3.0.5/lib/action_view/helpers/asset_tag_helper.rb:746:in `compute_public_path'' /var/lib/gems/1.8/gems/actionpack-3.0.5/lib/action_view/helpers/asset_tag_helper.rb:424:in `path_to_stylesheet'' /var/lib/gems/1.8/gems/actionpack-3.0.5/lib/action_view/helpers/asset_tag_helper.rb:875:in `ensure_stylesheet_sources!'' /var/lib/gems/1.8/gems/actionpack-3.0.5/lib/action_view/helpers/asset_tag_helper.rb:874:in `each'' /var/lib/gems/1.8/gems/actionpack-3.0.5/lib/action_view/helpers/asset_tag_helper.rb:874:in `ensure_stylesheet_sources!'' /var/lib/gems/1.8/gems/actionpack-3.0.5/lib/action_view/helpers/asset_tag_helper.rb:512:in `stylesheet_link_tag'' /data/sites/fundraisers-stage/releases/20110316194843/app/views/layouts/application.html.erb:4:in `_app_views_layouts_application_html_erb___19482063_70294907435920_0'' /var/lib/gems/1.8/gems/actionpack-3.0.5/lib/action_view/template.rb:135:in `send'' /var/lib/gems/1.8/gems/actionpack-3.0.5/lib/action_view/template.rb:135:in `render'' /var/lib/gems/1.8/gems/activesupport-3.0.5/lib/active_support/notifications.rb:54:in `instrument'' /var/lib/gems/1.8/gems/actionpack-3.0.5/lib/action_view/template.rb:127:in `render'' /var/lib/gems/1.8/gems/actionpack-3.0.5/lib/action_view/render/layouts.rb:80:in `_render_layout'' /var/lib/gems/1.8/gems/actionpack-3.0.5/lib/action_view/render/rendering.rb:62:in `_render_template'' /var/lib/gems/1.8/gems/activesupport-3.0.5/lib/active_support/notifications.rb:52:in `instrument'' /var/lib/gems/1.8/gems/activesupport-3.0.5/lib/active_support/notifications/instrumenter.rb:21:in `instrument'' /var/lib/gems/1.8/gems/activesupport-3.0.5/lib/active_support/notifications.rb:52:in `instrument'' /var/lib/gems/1.8/gems/actionpack-3.0.5/lib/action_view/render/rendering.rb:56:in `_render_template'' /var/lib/gems/1.8/gems/actionpack-3.0.5/lib/action_view/render/rendering.rb:26:in `render'' /data/sites/fundraisers-stage/releases/20110316194843/config/initializers/error_pages.rb:15:in `rescue_action_in_public''


El notificador de excepción tiene un método llamado notify_about_exception para iniciar la notificación de error a pedido.

class ApplicationController < ActionController::Base include ExceptionNotification::Notifiable rescue_from Exception, :with => :render_all_errors def render_all_errors(e) log_error(e) # log the error notify_about_exception(e) # send the error notification # now handle the page if e.is_a?(ActionController::RoutingError) render_404(e) else render_other_error(e) end end def render_404_error(e) # your code end def render_other_error(e) # your code end end


En Rails 3.2, es más fácil que eso:

Agregue esto a config/application.rb :

config.exceptions_app = self.routes

Eso hace que los errores se enruten a través del enrutador. Luego solo agrega a config/routes.rb :

match "/404", :to => "errors#not_found"

Obtuve esta información del ítem 3 en la entrada del blog " Mis cinco funciones ocultas favoritas en Rails 3.2 " por Por José Valim.


Sugeriría usar rescue_from en su lugar. Simplemente rescataría errores específicos en lugar de anular rescue_action_in_public. Esto es especialmente útil cuando se trata de errores definidos por el usuario o errores específicos del controlador.

# ApplicationController rescue_from ActionController::RoutingError, :with => :render_404 rescue_from ActionController::UnknownAction, :with => :render_404 rescue_from ActiveRecord::RecordNotFound, :with => :render_404 rescue_from MyApp::CustomError, :with => :custom_error_resolution def render_404 if /(jpe?g|png|gif)/i === request.path render :text => "404 Not Found", :status => 404 else render :template => "shared/404", :layout => ''application'', :status => 404 end end # UsersController rescue_from MyApp::SomeReallySpecificUserError, :with => :user_controller_resolution

http://api.rubyonrails.org/classes/ActiveSupport/Rescuable/ClassMethods.html


También me he enfrentado a tal problema. El problema es debido a attachment_fu gem o plugin. Simplemente desinstálelo y use cualquier otro plugin o gema que resuelva su problema.