Как я могу разработать систему голосования, где пользователи могут голосовать за других пользователей (то есть систему, подобную репутации)? - PullRequest
0 голосов
/ 29 января 2019

Вопрос: Как я могу использовать гем act_as_votable, чтобы система «репутации пользователя» работала для моей модели пользователя?Я не уверен в лучшем подходе, учитывая приведенный ниже код.

По сути, у меня есть модель пользователя.Что я хочу сделать, так это для некоторых пользователей (а именно учетных записей администраторов), они могут получить доступ к странице, где все пользователи доступны для просмотра, и «голосовать» за пользователя с точки зрения его репутации.

Моя проблема в том, чтоНасколько я понимаю, драгоценный камень требует как act_as_votable, так и act_as_voter внутри модели.

Однако, поскольку избиратель - это пользователь, а голосующий - тоже пользователь, я не уверен, как поступить с этим.

То, что я до сих пор делал, это:

Gem-файл:

gem 'acts_as_votable'

Консольные рельсы генерируют действие_as_votable: миграция рейка БД: миграция

У меня есть модель:

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>

1 Ответ

0 голосов
/ 29 января 2019

, поскольку user_reputation - это всего лишь одна запись для каждого пользователя, я считаю, что нужно установить отношение has_one вместо has_many между User и UserReputation, здесь приведены настройки для модели, обратите внимание: вам не нужно генерировать миграцию, так как таблица 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
...