Шалом еси, рубисты.
Если бы не бился над вопросом второй или третий день уже — не написал бы. Проблема вроде бы простая, но ключик не подобрать к ней никак.
Проблема с delayed_job.

Вызов create_tasks вызывает следующее: undefined method `name’ for nil:NilClass

Сам create_tasks

def create_tasks
email_id = Email.last.id
Victim.all.each { |victim|Spam.suffer(email_id, victim.email).deliver }
end
handle_asynchronously :create_tasks

Специально убрал вообще все параметры и сделал все что можно через базу(вначале вообще передавал все параметры письма), и все равно ничерта не получается. А проблема судя по постам должна решаться тем, что передаешь id записей вместо них самих. Остальная часть сайта работает, падает все именно на этом куске кода.
Бегает все на engine yard, если что.

9 Responses to Шалом еси, рубисты.

  1. NztRU:

    А покажи кусок кода, где происходит попытка вызвать этот самый name?

  2. RehMega:

    class SendingController < ApplicationController
    def index
    if request.post? && params[:email]
    email = Email.new(header: params[:email][:header], body: params[:email][:body])
    unless params[:email][:attachment].blank?
    email.file = params[:email][:attachment].read
    email.filename = params[:email][:attachment].original_fil ename
    end
    email.save
    create_tasks
    redirect_to controller: «files»
    end
    end

    def create_tasks(email_id = Email.last.id)
    Victim.all.each { |victim|Spam.delay.suffer(email_id, victim.email) }
    end
    handle_asynchronously :create_tasks
    end

    это весь контроллер.

  3. RehMega:

    на всякий случай мейлер еще, хотя вряд ли это важно.

    class Spam < ActionMailer::Base
    default from: «[email protected]«
    ActionMailer::Base.file_settings = { location: Rails.root.join(‘public/messages’) }

    # @param [Victim] victim
    # @param [Email] message
    def suffer(message_id, victim_email)
    victim = Victim.find_by_email(victim_email)
    victim.suffered = true
    message = Email.find_by_id(message_id)
    @message = message.body
    @name = victim.name
    attachments[message.filename] = message.file unless message.filename.nil?

    mail to: @victim = victim.email,
    subject: message.header,
    content_type: ‘multipart’,
    delivery_method: :file
    end
    end

  4. NztRU:

    Посмотри как джобы сериализуются в базу, судя по всему какие-то проблемы с victim_email и мейлер просто не находит объект victim. Еще вопрос: если у тебя create_tasks падает в delayed_job, зачем еще и Spam#deliver туда отправлять?

  5. RehMega:

    попросил одного человека дать примеры тестовых заданий у них — поучиться. в этом конкретном задании нужно несколько тысяч(десятков тысяч, сотен тысяч) писем отправить. если обрывается где-то на середине… а в общем-то ты прав, я же не просто так меняю флаг suffered у них, всё равно, пляшем.

  6. RehMega:

    и вправду. надо было лог посмотреть.
    там были чудесные строки:

    Started GET «/myadmin/scripts/setup.php» for 168.62.166.202 at 2012-10-17 19:41:12 +0000

    ActionController::RoutingError (No route matches [GET] «/myadmin/scripts/setup.php»):

    осталось только придумать, что с этим сделать.

  7. RehMega:

    а, не, это какие-то кулхацкеры что-то делали, извиняюсь.
    еще лучше строку встретил —
    Started GET «/w00tw00t.at.blackhats.romanian.anti-sec:)» for 168.62.166.202 at 2012-10-17 $

    ActionController::RoutingError (No route matches [GET] «/w00tw00t.at.blackhats.romanian.an$

  8. RehMega:

    снял structure:dump, с виду все в порядке:
    CREATE TABLE «delayed_jobs» («id» INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, «priority» integer DEFAULT 0, «attempts» integer DEFAULT 0, «handler» text, «last_error» text, «run_at» datetime, «locked_at» datetime, «failed_at» datetime, «locked_by» varchar(255), «queue» varchar(255), «created_at» datetime NOT NULL, «updated_at» datetime NOT NULL);
    CREATE TABLE «emails» («id» INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, «header» varchar(255), «body» text, «filename» varchar(255), «file» blob, «created_at» datetime NOT NULL, «updated_at» datetime NOT NULL);
    CREATE TABLE «schema_migrations» («version» varchar(255) NOT NULL);
    CREATE TABLE «victims» («id» INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, «name» varchar(255), «email» varchar(255), «suffered» boolean, «created_at» datetime NOT NULL, «updated_at» datetime NOT NULL);
    CREATE INDEX «delayed_jobs_priority» ON «delayed_jobs» («priority», «run_at»);
    CREATE UNIQUE INDEX «unique_schema_migrations» ON «schema_migrations» («version»);
    INSERT INTO schema_migrations (version) VALUES (‘20121010160735’);

    INSERT INTO schema_migrations (version) VALUES (‘20121016145813’);

    INSERT INTO schema_migrations (version) VALUES (‘20121016150143’);

  9. NztRU:

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

Добавить комментарий