Изправен съм пред много странен бъг с скъпоценния камък 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 към същия модел. Не мисля, че това трябва да е проблем, но може би си струва да се отбележи.
Наистина оценявам всеки принос.