1

我有困難構思如何以最好的方式做到這一點可能,而不必一個巨大的if/else結構。我知道我可以這樣做,但我想把它抽象成方法,我迷路了。搞清楚/重構這個的if/else進行投票系統

upvote = 1 
no vote = 0 
downvote = -1 

基本上,一個人可以打upvote或downvote按鈕。

如果他們點擊給予好評和他們目前的投票給予好評,這unvotes「後,將其設爲零

,如果他們點擊downvote和他們目前的投票給予好評,它切換它downvote

如果他們的投票是零,他們點擊給予好評,它會將票對1

逆是downvote

真正的這是我迄今爲止,但它不佔點擊給予好評,你已經點擊給予好評後, .. inst ead將其設置爲0將其設置爲-1。

我得到的問題,我只是有困難,搞清楚如何寫呢

def update_vote(upvote_or_downvote) 
    self.active_vote? ? self.value = 0 : self.alternate_vote 
    end 

    def active_vote? 
    self.value != 0 
    end 

    def alternate_vote 
    self.value *= -1 
    end 
+0

「如果他們點擊給予好評和他們目前的投票給予好評,這unvotes「的帖子,並將其設置爲零」 - 這並未對我來說看起來很直觀。我希望點擊downvote會將其設置爲零,因此我必須點擊downvote兩次以將其設置爲downvote。 – ghoppe

+0

我同意不同意。我只是遵循reddit和其他投票網站的做法。 – Tallboy

+0

我不會想到點擊Upvote取消我的投票。我會點擊投票。看起來你對封裝你的用戶界面邏輯感到困難,因爲它沒有任何意義。 –

回答

5

有很多方法可以做到這一點。這是一個。我認爲up_or_down會以+1爲upvote,-1爲downvote。不要過分複雜的事情。

def update_vote(up_or_down) 
    self.value = self.value == up_or_down ? 0 : up_or_down 
end 

這很簡單,如果你認爲邏輯是這樣的: 如果用戶點擊同樣的事情,重置爲零。否則,將其設置爲單擊的值。

+0

是的,事後看來,邏輯解釋使得它很容易編寫。我不知道爲什麼這麼難:S – Tallboy

1

用狀態機玩弄(更容易比我想象的):

require 'statemachine' #it's a gem 

vote_state = Statemachine.build do 
#trans old_state, event, new_state 
    trans :zero, :upvote, :up 
    trans :zero, :downvote, :down 
    trans :down, :upvote, :up 
    trans :down, :downvote, :zero 
    trans :up, :upvote, :zero 
    trans :up, :downvote, :down 
end 

vote_state.upvote 
p vote_state.state #=> :up 
vote_state.upvote 
p vote_state.state #=> :zero 
vote_state.upvote 
p vote_state.state #=> :up 
vote_state.downvote 
p vote_state.state #=> :down