1

巨大なif/else構造を持たずに、これを可能な限り最善の方法で行う方法を概念化するのに苦労しています。私はそれがそのようにできることを知っていますが、私はそれをメソッドに抽象化しようとしていて、迷子になっています。

upvote = 1
no vote = 0
downvote = -1

基本的に、人は賛成または反対のボタンを押すことができます。

彼らが賛成票をクリックし、現在の投票が賛成票である場合、投稿は「投票解除」され、ゼロに設定されます

彼らが反対票をクリックし、現在の投票が賛成票である場合、反対票に切り替わります

彼らの投票がゼロで、彼らが賛成票をクリックした場合、それは投票を1に設定します

反対票の場合は逆になります

これは私がこれまでに持っているものですが、すでに賛成票をクリックした後に賛成票をクリックすることは考慮されていません。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

それを行う方法はたくさんあります。これが1つです。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 に答える