2010-09-03 98 views
3

現在,我正在構建Ruby on Rails上的社交媒體應用程序,我實現了一個5分投票系統。您可以從1-5的網站投票發佈新聞,我想知道的是,處理投票系統更新的最佳方法是什麼?Ruby on Rails上的投票更新

例如。如果一個用戶已經在一篇文章中投了票,我想帶回他在文章中給出的分數並且軟鎖定投票(因爲我只允許每個用戶投一票,並且我允許在任何時候改變你的投票),但是如果他沒有我會提出與0投票的文章。

我知道一種方法來實現這一點,我可以在視圖中做到這一點,並檢查當前用戶是否已投票對本文我會將它們發送到編輯視圖,否則發送到SHOW視圖。 (我認爲)

無論如何,這是什麼「正確」的做法?

編輯:我忘了說投票組合框它是我渲染的部分。我想以某種方式更新部分?

EDIT2:

class Article < ActiveRecord::Base 

    has_many :votes 
    belongs_to :user 

    named_scope :voted_by, lambda {|user| {:joins => :votes, :conditions => ["votes.user_id = ?", user]} } 
end 

class User < ActiveRecord::Base 
    has_many :articles 
    has_many :votes, :dependent => :destroy 

    def can_vote_on?(article) 
    Article.voted_by(current_user).include?(article) #Article.voted_by(@user).include?(article) 
    end 

end 
+1

無論你在視圖中做什麼,不要忽略檢查在控制器(例如,如果用戶是最多投票,如果他已經投了票,就不要理會)。無論用戶有什麼想法,用戶都可以很容易地獲取或發佈任何他想要的內容。 – 2010-09-03 22:37:03

+0

是的......我實際上已經在控制器(和數據庫)上應用了「檢查」,我只是尋找在我看來實際做到的「有效」方式。 – Gotjosh 2010-09-03 22:49:16

回答

1

創建在於響應true如果用戶可以在物品上投票的用戶模型的方法:

class User < ActiveRecord::Base 

... 

def can_vote_on?(article) 
    articles_voted_on.include?(article) # left as an exercise for the reader... 
end 

end 

在視圖中,渲染如果一個表格用戶可以編輯,否則渲染正常視圖:

<% if @user.can_vote_on?(@article) %> 
    <%= render :partial => "vote_form" %> 
<% else %> 
    <%= render :partial => "vote_display" %> 
<% end %> 

或者您可以處理控制器中的所有內容,併爲表單版本和普通版本提供單獨的模板。最好的方法取決於你的具體情況。

EDIT2

當你發現,current_user沒有在模型中工作。這是有道理的,因爲可以從沒有會話概念的遷移,庫等中調用。

無論如何不需要訪問當前用戶,因爲您的實例方法是(根據定義)在實例上調用。只是指self在模型中,並調用該方法從上current_user的視圖,它是用戶的一個實例:

(在模型中)

def can_vote_on?(article) 
    Article.voted_by(self).include?(article) 
    end 

(在視圖中)

<% if current_user.can_vote_on?(@article) %> 

或者,如果控制器分配它,您可以用@user代替current_user

最後一兩件事,我想你的命名範圍應該使用user.id,就像這樣:

named_scope :voted_by, lambda {|user| {:joins => :votes, :conditions => ["votes.user_id = ?", user.id]} } 
+0

我應該在哪裏定義這個方法? articles_voted_on – Gotjosh 2010-09-04 02:53:19

+0

您可以在用戶模型中創建一個命名範圍,以檢索投票的文章。 – zetetic 2010-09-04 17:32:38

+0

您確定需要在用戶模型上創建命名範圍嗎?我一直在掙扎幾天,我似乎無法想象我怎麼才能返回當前用戶投票的文章列表,但是我確實很容易地從文章模型中完成了這項工作,我編輯了我的帖子並添加了方法。也許你可以給我多一點陽光。 – Gotjosh 2010-09-07 18:54:02