1

make_voteablegemで非常に奇妙なバグに直面しています。実際、それがレーキの問題に関連しているの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

ターミナルからdeadline/status /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

最後の観察:up / down_votesを同じモデルに追加した移行を実行した後、移行を実行してvoting_deadline列をプロジェクトテーブルに追加しました。これは問題ではないと思いますが、注目に値するかもしれません。

私は本当にどんな入力にも感謝します。

4

1 に答える 1

2

宝石によって引き起こされていなかったのは単なる検証エラーであることが判明しました。しかし、検証は作成時にのみ行われるべきであり、更新時にも行われていたため、完全に私のせいでした。

ただし、gemのコードは改善され、そのようなエラーが指摘される可能性があると思います。そのため、githubページでフィードバックを提供します。

于 2011-10-26T00:23:53.733 に答える