在没有庞大的if/else结构的情况下,我很难概念化如何以最好的方式做到这一点。我知道我可以这样做,但我试图将它抽象成方法,但我迷失了方向。
upvote = 1
no vote = 0
downvote = -1基本上,一个人可以点击上票或下票按钮。
如果他们点击了向上投票,而他们当前的投票是向上投票,它就会取消对帖子的投票,并将其设置为零
如果他们点击了下投票,而他们当前的投票是上投票,则会将其切换为下投票
如果他们的投票是零,并且他们点击了向上投票,它会将投票设置为1
对于下一次投票,情况正好相反
这是我到目前为止所拥有的,但它不能说明在你点击了upvote之后点击了upvote。它不是将其设置为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发布于 2012-05-11 02:33:18
有很多方法可以做到这一点。这里有一个。我假设up_or_down会以+1的支持率和-1的反对票通过。不要把事情搞得过于复杂。
def update_vote(up_or_down)
self.value = self.value == up_or_down ? 0 : up_or_down
end如果你这样思考逻辑,这很简单:如果用户点击相同的东西,重置为零。否则,将其设置为单击的值。
发布于 2012-05-11 03:23:28
玩弄状态机(这比我想象的要容易):
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 #=> :downhttps://stackoverflow.com/questions/10540016
复制相似问题