Напечатайте ошибку в Resque, и я не могу понять, что вызывает это - PullRequest
0 голосов
/ 31 декабря 2011

У меня есть фоновая задача, которая отправляет электронное письмо, обработанное Resque, с сообщением об ошибке TypeError, и я не могу понять, что его вызывает.

Я ставлю задачу: Resque.enqueue(ShownUpvoteEvent, self.id)

Затем я обрабатываю это в рабочем:

class ShownUpvoteEvent
  @queue = :email
  def self.perform(event_id)
    UserMailer.shown_upvote_event(event_id).deliver
  end
end

Вызов UserMailer вызывает этот метод:

def shown_upvote_event(event_id)
  @event = TimelineEvent.find(event_id)
  @user = @event.subject
  @actor = @event.actor
  @song = @event.secondary_subject
  if VideoVote.find_by_user_id_and_video_id(@actor.id, @song.id).value == 1
    @voted = "upvoted"
  else
    @voted = "downvoted"
  end    
  mail(:to => @user.email, :subject => "#{@actor.name} #{@voted} the song you showed to him/her.")
end

Resque показывает, что я успешно передал идентификатор объекта события в работника, но я понятия не имею, что вызывает эту ошибку TypeError Error can't convert String into Integer. Это трассировка стека:

/app/app/mailers/user_mailer.rb:60:in `[]'
/app/app/mailers/user_mailer.rb:60:in `shown_upvote_event'
/app/.bundle/gems/ruby/1.9.1/gems/actionpack-3.0.7/lib/abstract_controller/base.rb:150:in `process_action'
/app/.bundle/gems/ruby/1.9.1/gems/actionpack-3.0.7/lib/abstract_controller/base.rb:119:in `process'
/app/.bundle/gems/ruby/1.9.1/gems/actionpack-3.0.7/lib/abstract_controller/rendering.rb:41:in `process'
/app/.bundle/gems/ruby/1.9.1/gems/actionmailer-3.0.7/lib/action_mailer/old_api.rb:75:in `process'
/app/.bundle/gems/ruby/1.9.1/gems/actionmailer-3.0.7/lib/action_mailer/base.rb:471:in `process'
/app/.bundle/gems/ruby/1.9.1/gems/actionmailer-3.0.7/lib/action_mailer/base.rb:466:in `initialize'
/app/.bundle/gems/ruby/1.9.1/gems/actionmailer-3.0.7/lib/action_mailer/base.rb:450:in `new'
/app/.bundle/gems/ruby/1.9.1/gems/actionmailer-3.0.7/lib/action_mailer/base.rb:450:in `method_missing'
/app/app/workers/send_emails.rb:46:in `perform'

Действительно странно, что трассировка стека указывает на строку 60, потому что не похоже, чтобы этот код вызывался:

def heard_event(event_id)
  @event = TimelineEvent.find(event_id)
  @user = @event.subject
  @actor = @event.actor
  @song = @event.secondary_subject
  showable_video = ShowableVideo.find_by_user_id_and_profile_id_and_video_id(@user.id, @actor.id, @song.id)
  if showable_video.heard == true
  @heard = "had already heard"
  else
    @heard = "had not yet heard"
  end    
  #below is line 60, but this method should not be running
  mail(:to => @user.email, :subject => "#{@actor.name} #{@heard} the song you showed to him/her.")
end

def shown_upvote_event(event_id)
  @event = TimelineEvent.find(event_id)
  @user = @event.subject
  @actor = @event.actor
  @song = @event.secondary_subject
  if VideoVote.find_by_user_id_and_video_id(@actor.id, @song.id).value == 1
  @voted = "upvoted"
  else
    @voted = "downvoted"
  end    
  mail(:to => @user.email, :subject => "#{@actor.name} #{@voted} the song you showed to him/her.")
end
...