Работата на Cron прекъсва make_voteable gem?

Изправен съм пред много странен бъг с скъпоценния камък make_voteable. Всъщност дори не съм сигурен, че е свързано с make_voteable или дали е проблем с рейка.

Приложението ми има проектен модел. Проектите имат атрибут статус. Те започват като "Разработват се" и след достигане на зададения краен срок за разработка статусът се променя на "Предстои гласуване". След това потребителите могат да гласуват за проектите нагоре или надолу (до достигане на крайния срок за гласуване), за да ги приоритизират.

Така че, ако статусът на даден проект е „Предстои гласуване“, изгледът за показване на проекта показва връзки към следните действия на моя контролер за проекти:

def vote_yes
  @project = Project.find(params[:id])
  current_user.up_vote(@project)
  flash[:success] = 'Thanks for voting!'
  redirect_to @project
rescue MakeVoteable::Exceptions::AlreadyVotedError
  flash[:error] = 'You already voted!'
  redirect_to @project
end

def vote_no
  @project = Project.find(params[:id])
  current_user.down_vote(@project)
  flash[:success] = 'Thanks for voting!'
  redirect_to @project
rescue MakeVoteable::Exceptions::AlreadyVotedError
  flash[:error] = 'You already voted!'
  redirect_to @project
end

Всичко работи чудесно, ако актуализирам крайния срок/състояние/краен срок за гласуване през терминала или ръчно променя записа в базата данни. Гласуването работи според очакванията, като up_votes и down_votes се съхраняват в съответния запис на проекта.

Въпреки това, ако стартирам задачата cron, която настройвам, за да се погрижа за това, което е нормалният работен процес на приложението, изгледите изобразяват връзките за гласуване, потребителите могат да щракнат върху тях както обикновено, но не се съхранява глас в таблицата с проекти. Таблицата за гласуване обаче се попълва нормално и потребителят не може да гласува отново.

Единственото нещо, което cron прави, е да изпълни този код от модела на проекта:

def self.close_projects
  @finished_projects = Project.where('deadline < ? and status = ?', Time.now.utc, "Developing")
  @finished_projects.each do | project |
    project.update_attribute(:status, "Pending voting")
    project.update_attribute(:voting_deadline, Time.now.utc + 1.week )
  end
end

Само последно наблюдение: изпълних миграция, за да добавя колоната voting_deadline към таблицата с проекти, след като стартирах миграцията, която добави up/down_votes към същия модел. Не мисля, че това трябва да е проблем, но може би си струва да се отбележи.

Наистина оценявам всеки принос.


person rapcal    schedule 25.10.2011    source източник
comment
OT, но помислете за рефакторинг на тези методи :( Проследихте ли кода за гласуване, за да видите какво се случва?   -  person Dave Newton    schedule 25.10.2011
comment
Благодаря за приноса, Дейв. Мисля, че забелязах проблем с валидирането, който не е повдигнат от скъпоценния камък, нито от сървърите. И въпреки че не е по темата, тъй като тепърва се уча да програмирам, бихте ли ми посочили как да преработя кода? Съжалявам, че ви накарах да гледате толкова грозни реплики... ;)   -  person rapcal    schedule 26.10.2011
comment
Нещо подобно (напълно непроверено :)   -  person Dave Newton    schedule 26.10.2011


Отговори (1)


Оказа се, че това е просто грешка при валидиране, която не е повдигната от скъпоценния камък. Но това беше по моя вина, напълно, тъй като валидирането трябваше да се извършва само при създаване, а се случваше и при актуализации.

Мисля обаче, че кодът за скъпоценния камък може да се подобри, посочвайки грешки като такива, така че ще предоставя обратна връзка на тяхната страница в github.

person rapcal    schedule 26.10.2011