3

現在、Ruby on Rails でソーシャル メディア アプリを作成している最中で、5 点投票システムを実装しました。サイトに投稿されたニュースを 1 から 5 まで投票できます。私が知りたいのは、投票システムの更新を処理する最善の方法は何ですか。

例では。ユーザーが既に記事に投票した場合、記事で彼が付けたスコアを戻し、投票をソフトロックしたいと思います (ユーザーごとに 1 票のみを許可し、いつでも投票を変更できるため)。彼はそうではありません。投票数が 0 の記事を取り上げます。

私はこれを達成する方法を知っています。私はビューでそれを行うことができ、現在のユーザーがこの記事にすでに投票しているかどうかを確認し、それ以外の場合は SHOW ビューに送信します。(おもう)

とにかく、これを行うための「正しい」アプローチは何でしょうか?

編集: 投票コンボ ボックスは、私がレンダリングしているのは部分的なものであると言うのを忘れていました。どういうわけかパーシャルを更新するだけですか?

EDIT2:

class Article < ActiveRecord::Base

  has_many :votes
  belongs_to :user

  named_scope :voted_by, lambda {|user| {:joins => :votes, :conditions => ["votes.user_id = ?",  user]}  }
end

class User < ActiveRecord::Base
  has_many :articles
  has_many :votes, :dependent => :destroy

  def can_vote_on?(article)
    Article.voted_by(current_user).include?(article) #Article.voted_by(@user).include?(article)
  end

end
4

1 に答える 1

1

trueユーザーが記事に投票できる場合に応答する User モデルにメソッドを作成します。

class User < ActiveRecord::Base

...

def can_vote_on?(article)
  articles_voted_on.include?(article) # left as an exercise for the reader...
end

end

ビューで、ユーザーが編集できる場合はフォームをレンダリングし、それ以外の場合は通常のビューをレンダリングします。

<% if @user.can_vote_on?(@article) %>
  <%= render :partial => "vote_form" %>
<% else %>
  <%= render :partial => "vote_display" %>
<% end %>

または、コントローラーですべてを処理し、フォーム バージョンと通常バージョンに別々のテンプレートをレンダリングすることもできます。最適なアプローチは、状況の詳細によって異なります。

EDIT2

あなたが発見current_userしたように、モデルでは機能しません。セッションの概念がない移行、ライブラリなどから を呼び出すことができるため、これは理にかなっています。

インスタンスメソッドは(定義により)インスタンスで呼び出されるため、現在のユーザーにアクセスする必要はありません。モデルでを参照し、 User のインスタンスであるselfのビューからメソッドを呼び出すだけです。current_user

(モデル内)

  def can_vote_on?(article)
    Article.voted_by(self).include?(article)
  end

(ビューで)

<% if current_user.can_vote_on?(@article) %>

または、コントローラーが割り当てた場合に@user置き換えることもできます。current_user

最後に、次のように、名前付きスコープを使用する必要があると思いますuser.id

named_scope :voted_by, lambda {|user| {:joins => :votes, :conditions => ["votes.user_id = ?",  user.id]}  }
于 2010-09-03T23:35:11.713 に答える