Как установить карму для соответствующего пользователя - PullRequest
0 голосов
/ 12 апреля 2020

Я пытаюсь добавить функцию пользовательской кармы в свое приложение, и я почти закончил, только что карма присуждается другому пользователю.

NB, Моя система нравится с нуля и не действует_as_votable.

Что я хочу:

  1. Когда пользователь поднимает книгу, я хочу получить карму +1 быть награжденным book.user
  2. Если за пользователя проголосовало больше, чем за него, я хочу, чтобы у этого пользователя была отрицательная карма.

Что я получаю:

  1. Когда за книгу проголосуют, пользователь, проголосовавший за книгу, получает +1 карму вместо book.user.
  2. Когда пользователь с 0 кармой получает свою книгу с пониженным рейтингом, увеличение кармы на 1 вместо уменьшения.

    class AddKarmaToUsers

Мой код:

voice.rb

class Vote < ApplicationRecord
  belongs_to :user
  belongs_to :book

  validates_uniqueness_of :user_id, scope: :book_id

  after_create :increment_vote, :add_karma
  after_destroy :decrement_vote, :remove_karma

  private

  def increment_vote
    field = self.upvote ? :upvotes : :downvotes
    Book.find(self.book_id).increment(field).save
  end

  def decrement_vote
    field = self.upvote ? :upvotes : :downvotes
    Book.find(self.book_id).decrement(field).save
  end

  def add_karma
    user = User.find(self.user_id)
    user.increment(:karma, 1).save
  end

  def remove_karma
    user = User.find(self.user_id)
    user.decrement(:karma, 1).save
  end
end

Голос_контроллера.rb

class VotesController < ApplicationController
    def create
        book_id = params[:book_id]

        vote = Vote.new
        vote.book_id = params[:book_id]
        vote.upvote = params[:upvote]
        vote.user_id = current_user.id

        #check if vote by this user exists
        existing_vote = Vote.where(user_id: current_user.id, book_id: book_id)
        @new_vote = existing_vote.size < 1

        respond_to do |format|
            format.js {
                if existing_vote.size > 0
                    #destroy existing vote
                    existing_vote.first.destroy
                else
                    #save new vote
                    if vote.save
                        @success = true
                    else
                        @success = false
                    end

                    # @total_upvotes = @book.upvotes
                    # @total_downvotes = @book.downvotes
                end
                @book = Book.find(book_id)
                @is_upvote = params[:upvote]

                render "votes/create"
            }
        end
    end

    private

    def vote_params
        params.require(:vote).permit(:upvote, :book_id)
    end
end

1 Ответ

1 голос
/ 12 апреля 2020

Прежде всего, при использовании активных отношений записи вам не нужно вызывать Model.find в классе, просто вызовите отношение с его именем:

  def increment_vote
    field = self.upvote ? :upvotes : :downvotes
    book.increment(field).save
  end

  def add_karma
    user.increment(:karma, 1).save
  end

In add_karma и remove_karma Вы ссылаетесь на пользователя, которому принадлежит голос, а не на пользователя, которому принадлежит книга. Для достижения вашей цели вы также должны увеличивать и уменьшать карму владельца книги:

  def add_karma
    user.increment(:karma, 1).save
    book.user.increment(:karma, self.upvote ? 1 : -1).save
  end

  def remove_karma
    user.increment(:karma, 1).save
    book.user.decrement(:karma, 1).save
  end

Вы можете переписать свой контроллер, чтобы упростить код:

class VotesController < ApplicationController
  def create
    @vote = current_user.votes.find_or_initialize_by vote_params[:book_id]
    @vote.assign_attributes vote_params
    @success = @vote.save
    # instead of @book = @vote.book just use @vote.book in your view
    @book = @vote.book
    # instead of @is_upvote you can use @vote.upvote in your view
    @is_upvote = @vote.upvote
    respond_to do |format|
      format.js { render 'votes/create'}
    end
  end

  private

  def vote_params
    params.require(:vote).permit(:upvote, :book_id)
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...