0

stackoverflow の動作に似た質疑応答アプリがあります。投票モデルはポリモーフィックであり、他の 3 つのモデルに属しています。投票は、各コントローラーの投票メソッドを使用して、各モデルのメンバー POST ルートを介して作成されます。

次のuser_reputation方法は、投票の作成時に既存のユーザー評価に投票の「2 番目の」値 (上昇の場合は +5、下降の場合は -3) を追加することによって機能し、ユーザーの評判を設定しますが、設定するのは悪い習慣のように感じます。このような投票の値。

これを達成するためのよりクリーンな/ベストプラクティスの方法はありますか?

投票.rb

attr_accessible :value, :votable_id, :votable_type
belongs_to :votable, polymorphic: true
belongs_to :user

validates_inclusion_of :value, in: [1, -1]
validates_presence_of :user_id, :value, :votable_id, :votable_type
validates_uniqueness_of :user_id, scope: :votable_id
validates_uniqueness_of :value, scope: :votable_id

after_create :sum_votes

after_create :user_reputation

def user_reputation
    votable = self.votable_type.downcase
    user_rep = self.votable.user
    if self.value == 1
      user_rep.update_attributes(reputation: (user_rep.reputation + 5))
    elsif self.value == -1
      user_rep.update_attributes(reputation: (user_rep.reputation - 3))
    end
  end

投票_form.html.erb

<div class="vote">
    <div id='<%= "#{votes_count}_#{id}" %>' class="vote-box">
        <div class='<%= object.votes_count < 0 ? 'orange-arrows' : 'default-arrows' %>'>
            <h1><%= object.votes_count %></h1>
        </div>
    </div>
    <div id="arrows">
    <%= link_to raw("&#9650;"), vote_path.call(object, value: 1),id: "upvote", remote: true,  method: "post" %><br>
    <%= link_to raw(" &#9660;") , vote_path.call(object, value: -1), id: "downvote", remote: true, method: "post" %>
    </div>
</div>

ルート.rb

resources :answers do 
    member { post :vote }
  end

  resources :questions do 
    member { post :vote }
  end 

  resources :comments do 
    member { post :vote }
  end

コントローラーメソッド

def vote 
    @vote = current_user.votes.build(value: params[:value], votable_id: params[:id], votable_type: "Answer")
    respond_to do |format|
    if @vote.save
      format.html { redirect_to :back, notice: "Vote submitted" }
      format.js
    else
      format.html { redirect_to :back, alert: "You can't vote on your own content" }
      format.js
    end
  end
 end
4

1 に答える 1

1

Active Record Observerを見ることができます。実際に行っていることと同じですが、これらのロジックをモデルから分離できます。

そして、user_reputation メソッドの最初の行は必要ないと思います。

于 2013-06-10T15:05:30.307 に答える