#ruby-on-rails #ruby-on-rails-3 #rake #vote
#ruby-on-rails #ruby-on-rails-3 #грабли #Голосовать
Вопрос:
Я столкнулся с очень странной ошибкой с make_voteable gem. На самом деле я даже не уверен, что это связано с 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
Все отлично работает, если я обновляю крайний срок / статус / voting_deadline через терминал или вручную изменяю запись в базе данных. Голосование работает, как и ожидалось, при этом 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 в таблицу projects после запуска миграции, которая добавила up / down_votes к той же модели. Я не думаю, что это должно быть проблемой, но, возможно, это стоит заметить.
Я действительно ценю любой вклад.
Комментарии:
1. OT, но подумайте о рефакторинге этих методов: (Вы проследили код голосования, чтобы увидеть, что происходит?
2. Спасибо за информацию, Дэйв. Я думаю, что я обнаружил проблему с проверкой, которая не возникает ни у gem, ни у серверов. И хотя это не по теме, поскольку я только учусь программировать, не могли бы вы указать мне, как провести рефакторинг кода? Извините, что я заставил вас смотреть на такие уродливые строки … 😉
3. Что-то вроде этого (полностью непроверенный 🙂
Ответ №1:
Оказывается, это была просто ошибка проверки, которая не была вызвана gem. Но это была моя ошибка, полностью, поскольку проверка должна выполняться только при создании, и это происходило и при обновлениях.
Тем не менее, я думаю, что код для gem можно улучшить, указав на подобные ошибки, поэтому я предоставлю некоторые отзывы на их странице github.