2012-01-31 27 views
1

シンプルな投票システムを構築する方法についてチュートリアルthisが見つかりました。投票のアップ/ダウン(Rails)をクリックした後、単純投票システムはデータベースに投票を追加しませんか?

は、私はすでにユーザーポストモデルを(だけでは、関連する列を含む)があると私は考案を使用しています:

create_table "posts", :force => true do |t| 
    t.string "content" 
    t.integer "user_id" 
    t.string "title" 
    t.integer "total_value", :default => 0 // Added by following the tutorial 
    end 

    create_table "users", :force => true do |t| 
    t.string "username" 
    end 

post.rb:

class Post < ActiveRecord::Base 
    attr_accessible :title, :content 

    belongs_to :user 
    has_many :comments, :dependent => :destroy 
    has_many :votes, :dependent => :destroy 
end 

user.rb:

class User < ActiveRecord::Base  
    has_many :posts, :dependent => :destroy 
    has_many :comments, :dependent => :destroy 
end 

vote.rb:

class Vote < ActiveRecord::Base 
    belongs_to :post 
end 

マイグレーション:

class CreateVotes < ActiveRecord::Migration 
    def change 
    create_table :votes do |t| 
     t.integer :post_id 
     t.integer :user_id 
     t.boolean :value 

     t.timestamps 
    end 

    add_index :votes, [:post_id, :user_id] 
    end 
end 

votes_controller.rb

class VotesController < ApplicationController 
    def vote_up 
    check = Votes.find(:first, 
         :conditions => ["user_id = ? AND post_id = ?", session[:user_id], params[:id]]) 

    post = Post.find(params[:id]) 

    if check.nil? 
     vote = Votes.new 
     vote.post_id = params[:id] 
     vote.user_id = session[:user_id] 
     vote.value = true 
     vote.save 
     post.total_value += 1 
     post.save 
     render :text => post.total_value 
    elsif check.value == false 
     check.value = true 
     check.save 
     post.total_value += 2 
     post.save 
     render :text => post.total_value 
    else 
     render :text => "You have already voted up for this post." 
    end 
    end 

    def vote_down 
    check = Vote.find(:first, 
         :conditions => ["user_id = ? AND post_id = ?", session[:user_id], params[:id]]) 

    post = Post.find(params[:id]) 

    if check.nil? 
     vote = Vote.new 
     vote.post_id = params[:id] 
     vote.user_id = session[:user_id] 
     vote.value = true 
     vote.save 
     post.total_value -= 1 
     post.save 
     render :text => post.total_value 
    elsif check.value == true 
     check.value = false 
     check.save 
     post.total_value -= 2 
     post.save 
     render :text => post.total_value 
    else 
     render :text => "You have already voted down for this post." 
    end 
    end 
end 

ビュー/ページ/ index.html.erb:

<% for i in @posts %> 
    <h2><%= i.title %></h2> 
    <p><%= i.content %></p> 

    <div id="total_value_<%= i.id %>"><%= i.total_value %></div> 

    <%= link_to "Vote up", :url => {:controller => :votes, :action => :vote_up, :id => i.id}, 
          :update => "total_value_#{i.id}", 
          :remote => true %> 
    <%= link_to "Vote down", :url => {:controller => :votes, :action => :vote_down, :id => i.id}, 
          :update => "total_value_#{i.id}", 
          :remote => true %> 
<% end %> 

すべてを表示、エラーはありませんが、私はアップ投票または否決クリックしたときに、絶対に何も起こりません。

これを修正するための提案はありますか?

編集:私はこのような端末内だけのものをメッセージを作成/任意のエラーや保存が表示されていない

がGET開始「/assets/application.js?body= 1」を127.0.0.1に設定しています 2012-02-01 06:47:50 +0800提供されたアセット/application.js - 304不可 変更済み(0ms)[2012-02-01 06:47:50] WARN決定できませんでした レスポンス本文のcontent-length。応答のコンテンツ長を設定したり セットレスポンス位=真

+1

Webrickサーバーのログインをコンソールで確認してください。投票は保存されますか?あなたはSQLクエリでそれを見ますか? – Johny

+0

@Johny何も起こりません。端末は次のようなものを表示します: '開始GET" /assets/application.js?body=1 "for 127.0.0.1 for 2012-02-01 06:47:50 + 0800' – alexchenco

+0

@alexchencoどのように問題を解決しましたか? –

答えて

1

チャンクあなたは投票を持っている代わりに、それはおそらくタイプミスですが、あなたは、Vote.new、Vote.findを持つべきではない、

。見つけてVotes.new

class VotesController < ApplicationController 
    def vote_up 
    check = Votes.find(:first, 
         :conditions => ["user_id = ? AND post_id = ?", session[:user_id], params[:id]]) 

    post = Post.find(params[:id]) 

    if check.nil? 
     vote = Votes.new 
     vote.post_id = params[:id] 
     vote.user_id = session[:user_id] 
     vote.value = true 
     vote.save 
     post.total_value += 1 
     post.save 
     render :text => post.total_value 
    elsif check.value == false 
     check.value = true 
     check.save 
     post.total_value += 2 
     post.save 
     render :text => post.total_value 
    else 
     render :text => "You have already voted up for this post." 
    end 
    end 

    def vote_down 
    check = Vote.find(:first, 
         :conditions => ["user_id = ? AND post_id = ?", session[:user_id], params[:id]]) 

    post = Post.find(params[:id]) 

    if check.nil? 
     vote = Vote.new 
     vote.post_id = params[:id] 
     vote.user_id = session[:user_id] 
     vote.value = true 
     vote.save 
     post.total_value -= 1 
     post.save 
     render :text => post.total_value 
    elsif check.value == true 
     check.value = false 
     check.save 
     post.total_value -= 2 
     post.save 
     render :text => post.total_value 
    else 
     render :text => "You have already voted down for this post." 
    end 
    end 
end 

Vote.newとVote.findに変更して参照してください。

UPDATE:

私はあなたがデバッガの宝石を使用することをお勧め。 もう1つの提案は、この機能に宝石を使用することです。これにはたくさんの宝石が作られています。 vote_fuとacts_as_votableが最もよく使用されます。

+0

あなたは正しいですね。ありがとう!しかし、それでも同じ結果が得られます。 'Vote.all'はまだインスタンスが0です(' => [] 'を出力します)。 – alexchenco

+0

問題を見るには 'debugger'を使うことをお勧めします。 –