Ruby on Rails - 错误500

时间:2015-11-16 20:42:16

标签: ruby-on-rails ruby error-handling

我有一个客户在轨道上运行ruby,不幸的是我并不是100%使用Ruby ...不管怎样他们的网站在浏览网站时仍然会返回错误500.

查看error_log所有我能看到的内容如下:

[ 2015-11-16 20:16:45.5125 11424/7fcdb8049700 Pool2/SmartSpawner.h:298 ]: Preloader for /home/rails/production started on PID 22379, listening on unix:/tmp/p$
App 22504 stdout:
App 22950 stdout:
App 22950 stderr: /home/rails/.rvm/gems/ruby-1.9.3-p484/gems/tlsmail-0.0.1/lib/net/smtp.rb:806: warning: already initialized constant SMTPSession
App 22950 stderr: /home/rails/.rvm/gems/ruby-1.9.3-p484/gems/tlsmail-0.0.1/lib/net/pop.rb:687: warning: already initialized constant POP
App 22950 stderr: /home/rails/.rvm/gems/ruby-1.9.3-p484/gems/tlsmail-0.0.1/lib/net/pop.rb:688: warning: already initialized constant POPSession
App 22950 stderr: /home/rails/.rvm/gems/ruby-1.9.3-p484/gems/tlsmail-0.0.1/lib/net/pop.rb:689: warning: already initialized constant POP3Session
App 22950 stderr: /home/rails/.rvm/gems/ruby-1.9.3-p484/gems/tlsmail-0.0.1/lib/net/pop.rb:702: warning: already initialized constant APOPSession
App 22950 stdout: MultiParameterHack loaded
App 22950 stderr: [deprecated] I18n.enforce_available_locales will default to true in the future. If you really want to skip validation of your locale you can set$
[ 2015-11-16 20:33:27.7232 11424/7fcdb9f61700 Pool2/SmartSpawner.h:298 ]: Preloader for /home/rails/production started on PID 22950, listening on unix:/tmp/p$
App 23101 stdout:

任何人都可以为我解释这个问题吗?

我也可以在production.log中看到这个:

Rendered shared/_meganav.html.erb (86.0ms)
Rendered pages/home.html.erb within layouts/application (197.9ms)
Completed 500 Internal Server Error in 278ms
** [Airbrake] Success: Net::HTTPOK
** [Airbrake] Environment Info: [Ruby: 1.9.3] [Rails: 3.0.19] [Env: production]
** [Airbrake] Response from Airbrake:
UUID: 1555278126118213905
URL:  https://airbrake.io/locate/1555278126118213905

ActionView::Template::Error (undefined method `has_image?' for nil:NilClass):
    269:                           <% event = Event.featured.newest.first %>
    270:
    271:              <article class="featured-event">
    272:                <% if event.has_image? %>
    273:                <div class="image"><span></span><%= link_to(image_tag(event.image.expiring_url(:featured)), event_path(event)) %></div>
    274:                <% end %>
    275:                  <div class="text">
  app/views/shared/_meganav.html.erb:272:in `_app_views_shared__meganav_html_erb__3450254428998327647_59198060__3999436880091196355'
  app/views/layouts/application.html.erb:223:in `_app_views_layouts_application_html_erb__1905251585106566541_49797400_3662579409495417543'

2 个答案:

答案 0 :(得分:2)

我怀疑您的问题是Event没有匹配featured.newest,这意味着event为零。由于nil#has_image?不是可用方法,因此抛出NoMethodError,最终在服务器上看到500错误。

事件查询属于您的控制器,您的输出应该有一个nil-guard以确保不会发生这种情况。例如:

# app/controllers/pages_controller.rb
def index
  @event = Event.featured.newest.first
end

# app/views/pages/home.html.erb
<% if @event.present? %>
  <article class="featured-event">
  ...
  </article>
<% end %>

答案 1 :(得分:1)

<% if event.has_image? %>更改为:

<% if event && event.has_image? %>

...或者在Ruby&gt; = 2.3

<% if event&.has_image? %>