Попытка получить общее количество голосов с помощью get_vote.size и получение неопределенного метода для get_vote на мой взгляд

Примерно то, что написано в моем названии. Я использую гем Act As Votable, и с моего терминала код работает с записью голосования, и он сохраняется в таблице голосования. Когда я нажимаю кнопку «За», я получаю сообщение об ошибке undefined get_vote при попытке суммировать количество голосов за комментарий в сообщении.

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

Мои маршруты

Rails.application.routes.draw do
  devise_for :users
  # For details on the DSL available within this file, see 
http://guides.rubyonrails.org/routing.html
  resources :posts do
    resources :comments
      member do
        put "like", to: "comments#upvote"
        put "dislike", to: "comments#downvote"
      end
  end
  root 'posts#index'
end

Модель пользователя

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
  has_many :posts
  has_many :comments, through: :posts
  acts_as_voter
end

Модель комментария

class Comment < ApplicationRecord
  validates :user_id, presence: true
  belongs_to :user
  belongs_to :post
  acts_as_votable
end

Вид

<div class="container">


<p>Title: <%= @post.title %></p></br>
<p>Category: <%= @post.category %></p></br>
<p>Body: <%= @post.body %></p></br>
<p>Date Created: <%= @post.created_at.strftime("%B %d, %Y") %></p></br>

<%= link_to 'Home', root_path %>
<%= link_to 'Edit', edit_post_path(@post) %>
<%= link_to 'Delete', @post, method: :delete, data: {confirm: "Are you sure you want to delete #{@post.title}?"} %>

<% if user_signed_in?  %>
<%= render :partial => "comments/comment" %>
<% else %>
<%= "Please sign up or sign in to leave a comment." %>
<% end %>
</div>

<br />
<div class="container">
  <table class="table table-striped">
    <tbody>
      <% @post.comments.each do |f| %>
      <tr>
        <td><%= link_to like_post_path(@post), class: "like", method: :put do %>
          <i class="fa fa-angle-up"></i>
          <%= @post.get_upvotes.size %>
        <% end %>
        </td>
        <td><%= f.text %></td>
        <td><%= f.try(:user).try(:username) %></td>
        <td><%= f.created_at %></td>
      </tr>
      <% end %>
    </tbody>
  </table>

  </div>

  <div>
    <%=  @comment.try(:user).try(:username) %>
  </div>

Контроллер моих комментариев

class CommentsController < ApplicationController
  before_action :upvote

  def create
    @post = Post.find(params[:post_id])
    @comment = @post.comments.new(comment_params)
    @comment.user = current_user
    if @comment.save
      redirect_to @post
    else
      redirect_to @post
    end
  end

  def destroy
    @post = Post.find(params[:id])
    @comment = @post.comments.find(params[:id])
    @comment.destroy
    redirect_to @post
  end

  def upvote
    @post = Post.find(params[:id])
    @comment = @post.comments.find(params[:id])
    @comment.upvote_from current_user
    redirect_to @post
  end

  def downvote
    @post = Post.find(params[:id])
    @comment = @post.comments.find(params[:id])
    @comment.downvote_from current_user
    redirect_to @post
  end

private

  def comment_params
    params.require(:comment).permit(:text, :user_id, :username)
  end

end

На всякий случай это мои маршруты

 Prefix Verb   URI Pattern                                 Controller#Action
        new_user_session GET    /users/sign_in(.:format)                    devise/sessions#new
            user_session POST   /users/sign_in(.:format)                    devise/sessions#create
    destroy_user_session DELETE /users/sign_out(.:format)                   devise/sessions#destroy
       new_user_password GET    /users/password/new(.:format)               devise/passwords#new
      edit_user_password GET    /users/password/edit(.:format)              devise/passwords#edit
           user_password PATCH  /users/password(.:format)                   devise/passwords#update
                         PUT    /users/password(.:format)                   devise/passwords#update
                         POST   /users/password(.:format)                   devise/passwords#create
cancel_user_registration GET    /users/cancel(.:format)                     devise/registrations#cancel
   new_user_registration GET    /users/sign_up(.:format)                    devise/registrations#new
  edit_user_registration GET    /users/edit(.:format)                       devise/registrations#edit
       user_registration PATCH  /users(.:format)                            devise/registrations#update
                         PUT    /users(.:format)                            devise/registrations#update
                         DELETE /users(.:format)                            devise/registrations#destroy
                         POST   /users(.:format)                            devise/registrations#create
           post_comments GET    /posts/:post_id/comments(.:format)          comments#index
                         POST   /posts/:post_id/comments(.:format)          comments#create
        new_post_comment GET    /posts/:post_id/comments/new(.:format)      comments#new
       edit_post_comment GET    /posts/:post_id/comments/:id/edit(.:format) comments#edit
            post_comment GET    /posts/:post_id/comments/:id(.:format)      comments#show
                         PATCH  /posts/:post_id/comments/:id(.:format)      comments#update
                         PUT    /posts/:post_id/comments/:id(.:format)      comments#update
                         DELETE /posts/:post_id/comments/:id(.:format)      comments#destroy
               like_post PUT    /posts/:id/like(.:format)                   comments#upvote
            dislike_post PUT    /posts/:id/dislike(.:format)                comments#downvote
                   posts GET    /posts(.:format)                            posts#index
                         POST   /posts(.:format)                            posts#create
                new_post GET    /posts/new(.:format)                        posts#new
               edit_post GET    /posts/:id/edit(.:format)                   posts#edit
                    post GET    /posts/:id(.:format)                        posts#show
                         PATCH  /posts/:id(.:format)                        posts#update
                         PUT    /posts/:id(.:format)                        posts#update
                         DELETE /posts/:id(.:format)                        posts#destroy
                    root GET    /                                           posts#index

Это ошибка, которую я получаю

NoMethodError в / posts / 1 неопределенный метод `get_upvotes 'для #

Скриншот также ошибки

Включите полученное сообщение об ошибке точный.

jeffdill2 10.08.2018 14:57

Могу я узнать версию actions_as_votable?

Gautam Kathrotiya 10.08.2018 15:09

Я использую гем этой версии «cts_as_votable »,« ~> 0.11.0 ». Я работал над этим проектом и на несколько месяцев отказался от него из-за работы.

grifftaur 10.08.2018 15:11

@grifftaur часть сообщения об ошибке отключена. Убедитесь, что сообщение присутствует полностью.

jeffdill2 10.08.2018 15:21

Вы показываете только код своей модели для Comment, а не для Post, поэтому не могу сказать наверняка - но, скорее всего, в вашей модели acts_as_votable не указан Post.

jeffdill2 10.08.2018 15:41

@ jeffdill2, вот в чем проблема. Спасибо за вашу помощь. Я ценю это!

grifftaur 10.08.2018 15:44
0
6
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, вы настроили Comment как acts_as_votable, но вызываете get_upvotes на экземпляре Post. Вы включили acts_as_votable в Post?

(Кроме того, похоже, что в опубликованном вами сообщении об ошибке не указаны некоторые подробности о том, что получает get_upvotes)

Вот и все! У меня это было в моей модели комментариев, а не в моей модели публикации. Спасибо за вашу помощь.

grifftaur 10.08.2018 15:43

Другие вопросы по теме