2013-07-04 111 views
1

我正在嘗試實施投票系統,投票人受到選民ip_address的限制。每個IP地址一個投票

我有一個職位模型,其中many_votes和票屬於職位模型。

我的問題是如何以及在哪裏定義「current_user」以及如何在視圖中實現這一點。

目前我創建的投票是這樣的:除了人

<%= link_to(post_votes_path(post), :method => 'post') do %> 
<%= song.votes.size %> 

工作正常,可以投票,我想停止。請不要尋找寶石,我只是試圖從頭學習這個功能。

乾杯。

這裏是我的帖子控制器代碼:

def create 
@post = Post.new(params[:post]) 

respond_to do |format| 
    if @post.save 
    format.html { redirect_to root_url, notice: 'Post was successfully created.' } 
    else 
    format.html { render action: "new" } 
    end 
end 
end 

和表決控制器代碼創建行動:在ip

def create 
@post = Post.find(params[:post_id]) 
@vote = @post.votes.create 
respond_to do |format| 
    format.html { redirect_to root_url } 
    #format.js 
end 
end 
+0

你也可以告訴你的用戶如何存儲? – AnkitG

+0

當前我沒有用戶表,我正在考慮在投票表中添加voter_id? – Joshua

+2

您應該在您的投票表中添加一列'voter_ip',並將其放在投票人的IP:'@ post.votes.create(voter_ip:request.remote_ip)'(變量'request'僅在控制器中可用,當你收到一個請求時)然後像@Gene說的那樣,在你的Vote模型中添加'validates:voter_id,uniqueness:true'。 – MrYoshiji

回答

1

像MrYoshiji建議的那樣,您應該在您的投票表中添加voter_ip列。

您可以在此AR where條款添加到您的帖子/票控制器

if @post.votes.where(voter_ip: request.remote_ip).empty? 
    @post.votes.create(vote: params[:post_vote]) 
end 

這將檢查這個職位以來,從目前的IP任何選票。在沒有記錄投票的情況下,添加新投票,參數值爲post_vote

如果您希望爲vote模型添加約束條件,則需要進行範圍驗證。

validates_uniqueness_of :voter_ip, scope: :post_id 

當使用唯一性約束施加到voter_ippost_id組合範圍參數,而不是單獨voter_ip

+0

範圍驗證是我正在尋找的。完美工作。謝謝。 – Joshua

+1

在Rails 4中,你可以使用where.not子句。 http://blog.remarkablelabs.com/2012/12/not-equal-support-for-active-record-queries-rails-4-countdown-to-2013 – scaryguy

+0

乾杯,只是想知道我怎麼能打電話像「vote_for 「在一個視圖。例如檢查當前用戶ip_是否投了帖子。 – Joshua

1

的投票表需要具有獨特的驗證約束。然後,如果您嘗試爲每個IP記錄多個投票,則控制器的保存將失敗,您可以檢測並使用它來刷新錯誤。您必須發佈您的控制器代碼才能獲得更好的答案。

+0

用控制器代碼編輯我的原始帖子。 – Joshua

+0

只是想知道如果軌道自動檢測IP列並將其匹配到一個IP地址? – Joshua

+0

@Joshua不,你需要在你的控制器中將這些鏈接在一起。 – tadman