1

在没有庞大的 if/else 结构的情况下,我很难概念化如何以最好的方式做到这一点。我知道我可以那样做,但我试图将它抽象成方法,我迷路了。

upvote = 1
no vote = 0
downvote = -1

基本上,一个人可以点击赞成或反对按钮。

如果他们点击 upvote 并且他们当前的投票是 upvote,它会“取消投票”帖子并将其设置为零

如果他们点击了downvote并且他们当前的投票是upvote,它会将其切换为downvote

如果他们的投票为零,并且他们点击了upvote,它将投票设置为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
4

2 回答 2

5

有很多方法可以做到这一点。这是一个。我认为 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-10T18:33:18.433 回答
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
于 2012-05-10T19:23:27.990 回答