新手问题 Rails Voting System - 用户投票状态

lnglau · 2014年09月29日 · 最后由 lnglau 回复于 2014年09月29日 · 1891 次阅读

大家好,本人 Rails 新手,在实现用户投票的时候遇到个问题: 我需要在 links#index 下显示当前登录用户对于每个 link 的投票情况,请问有什么好的解决办法呢?

create_table "links", force: true do |t|
  t.string   "description"
  t.string   "url"
  t.datetime "created_at"
  t.datetime "updated_at"
  t.integer  "user_id"
end

create_table "users", force: true do |t|
  t.string   "name"
  t.string   "email"
  t.string   "user_name"
  t.string   "password_digest"
  t.datetime "created_at"
  t.datetime "updated_at"
end

create_table "votes", force: true do |t|
  t.integer  "user_id"
  t.integer  "link_id"
  t.integer  "vote"
  t.datetime "created_at"
  t.datetime "updated_at"
end

我现在想到的办法是在 links_controller 的 index action 下加入 load_user_votes 这个方法:

#link.rb
class Story < ActiveRecord::Base
  attr_accessor :vote
end
#links_controller.rb
def index
  @links = Link.all

  load_user_votes(@links)
end

private
def load_user_votes(links)
  if current_user
    if votes = Vote.where(user_id: current_user.id, link_id: links.map(&:id))
      votes.each do |v|
        links.each do |l|
          if l.id == v.link_id
            l.vote = v.vote
          end
        end
      end
    end
  end
end

然后再在 view 里做根据 link.vote 判断,决定 html class name。 请问大家有好的办法吗?先谢谢了。

大家都去关注 HK 了么,给个思路吧。

同新手,我觉得可以这样实现 load_user_votes 方法

def load_user_votes(links)
  links.each do |link|
    link.votes.each do |vote|
      if current_user && vote.user_id == current_user.id
        link.vote = vote.vote
        next
    end
  end
end
需要 登录 后方可回复, 如果你还没有账号请 注册新账号