问题:如何使用act_as_votable gem获得适用于我的用户模型的“用户信誉”系统?根据下面的代码,我不确定最好的方法。
基本上,我有一个用户模型。我想要做的是,对于某些用户(即admin帐户),他们可以访问一个页面,该页面上所有用户都是可见的,并且可以根据其信誉为该用户“投票”。
我的问题是,据我所知,gem在模型中既需要acts_as_votable,又需要acts_as_voter。
但是,由于投票者是用户,而投票者也是用户,所以我不确定如何进行此操作。
到目前为止,我所做的是:
宝石文件:
gem 'acts_as_votable'
控制台 rails产生acts_as_votable:migration 耙db:migrate
我的模型是:
class User < ActiveRecord::Base
end
基于此,推荐的解决方案是什么?
我尝试创建另一个名为“ UserReputation”的模型,并生成了相关的控制器和视图。
这种方法的问题在于,当我进入索引页面时,对于用户声誉而言,它并不能按“喜欢”和“不喜欢”按钮显示所有用户。
我理解为什么会这样,因为UserReputation由用户创建,然后用户将投票给UserReputation(类似于论坛帖子)。这不是我想要做的,但是我正在遵循一个教程。
从本质上讲,如果这是唯一的方法,是否有可能在User和UserReputation之间建立“链接”,以便将它们绑在一起?
这是我尝试的代码:
class User < ActiveRecord::Base
acts_as_voter
has_many :user_reputations
end
class UserReputation < ActiveRecord::Base
acts_as_votable
belongs_to :user
end
class UserReputationsController < ApplicationController
def index
@user_reputations = UserReputation.all
@users = User.all
end
end
用户信誉指数:
<table class="table" style="font-size: 18px;">
<thead>
<tr>
<th> Username </th>
<th> Reputation </th>
<th> Upvote </th>
<th> Downvote </th>
</tr>
</thead>
<tbody>
<% @user_reputations.each do |user_reputation| %>
<tr>
<td> <%= user.email %> </td>
<th> <%= "Reputation" %> </th>
<td> <%= link_to like_user_reputation_path(user), method: :put do %>
like
<%= user_reputation.get_upvotes.size %>
<% end %> </td>
<td> <%= link_to dislike_user_reputation_path(user), method: :put do %>
dislike
<%= user_reputation.get_downvotes.size %>
<% end %> </td>
</tr>
<% end %>
</tbody>
</table>
<br>
答案 0 :(得分:0)
因为user_reputation仅是每个用户的一条记录,所以我的意见是在用户和UserReputation之间设置has_one而不是has_many关系,这是模型的设置,请注意:由于user_reputations表已经具有迁移,因此您无需生成迁移user_id字段
在您的模型中
class User < ActiveRecord::Base
acts_as_voter
has_one :user_reputation # new changes
end
class UserReputation < ActiveRecord::Base
acts_as_votable
belongs_to :user
end
在您的控制器中
class UserReputationsController < ApplicationController
def index
@users = User.all
redirect_to user_reputations_path
end
def like_user
@user_reputation = UserReputation.find(params[user_reputation_id])
@user_reputation.liked_by current_user
# current_user is available from application controller if you using bcrypt or devise
end
def dislike_user
@user_reputation = UserReputation.find(params[user_reputation_id])
@user_reputation.downvote_from current_user
end
end
在您看来
<table class="table" style="font-size: 18px;">
<thead>
<tr>
<th> Username </th>
<th> Reputation </th>
<th> Upvote </th>
<th> Downvote </th>
</tr>
</thead>
<tbody>
<% @users.each do |user| %>
<tr>
<td> <%= user.email %> </td>
<td> <%= @user.user_reputation.votes_for.size %> </td>
# here the relation set between user and user_reputation
# since it set one user only one user_reputation
# and you can get scope votes_for since it has acts_as_votable
<td>
<%= link_to "Like", like_user_reputation_path(user_reputation_id: @user.user_reputation.id) %>
</td>
<td>
<%= link_to "dislike", dislike_user_reputation_path(user_reputation_id: @user.user_reputation.id) %>
</td>
</tr>
<% end %>
</tbody>
</table>
在您的路线文件中
resources :user_reputations do
collection {
get :like_user
get :dislike_user
}
end