Ruby on Rails - "неопределенный метод` [] 'для nil: NilClass "при использовании gem_cons_as_votable - PullRequest
0 голосов
/ 08 сентября 2018

Я пытаюсь создать клон Reddit, в котором пользователи и посты с голосами вверх и вниз. Я установил и запустил необходимые миграции для acts_as_votable gem (https://github.com/ryanto/acts_as_votable):

# app/models/user.rb
class User < ApplicationRecord
    has_many :posts
    devise :database_authenticatable, :registerable, :trackable, :validatable
    ...
    acts_as_voter
end

# app/models/post.rb
class Post < ActiveRecord::Base
    belongs_to :user
    ...
    acts_as_votable
end

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

# app/models/text_post.rb
class TextPost < Post
...
end

# app/models/link.rb
class Link < Post
...
end

Я пытался реализовать функциональность upvote / downvote (http://www.mattmorgante.com/technology/votable):

# config/routes.rb
...
resources :posts do
    member do 
        put "like", to: "posts#upvote"
        put "dislike", to: "posts#downvote"
    end
    ...
end
...

# app/controllers/posts_controller.rb
class PostsController < ApplicationController
    before_action :authenticate_user!, except: :index
    ...
    def upvote
        @post = Post.find(params[:id])
        @post.upvote_by current_user
        redirect_to :back
    end

    def downvote
        @post = Post.find(params[:id])
        @post.downvote_by current_user
        redirect_to :back
    end
end

# app/views/posts/index.html.erb
...
<% @posts.each do |post| %>
    ...
    <%= link_to like_post_path(post), method: :put do %>
        <i class="fa fa-arrow-up"></i>
    <% end %>
    ...
    <%= link_to dislike_post_path(post), method: :put do %>
        <i class="fa fa-arrow-down"></i>
    <% end %>
    ...
<% end %>
...

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

NoMethodError в PostsController # upvote

неопределенный метод `[] 'для nil: NilClass

в этой строке в моем контроллере:

@post.upvote_by current_user

Даже если я попытаюсь сделать это вручную в консоли, не используя current_user , я получу ту же ошибку:

irb(main):001:0> user = User.first
...
irb(main):002:0> post = Post.first
...
irb(main):003:0> post.upvote_by user
...
Traceback (most recent call last):
    1: from (irb):3
NoMethodError (undefined method `[]' for nil:NilClass)

Я не уверен, что с моим кодом что-то не так или, возможно, это проблема совместимости, так как я использую Rails 5.2.0 и страницу GitHub для списков acts_as_votable только 5.0 и 5.1 как поддерживаемые версии.

Если бы кто-нибудь мог пролить свет на это, это было бы очень признательно.

1 Ответ

0 голосов
/ 08 сентября 2018

upvote_by представляется псевдонимом vote_up, может быть, вы не используете ту же версию гема из учебника?

https://github.com/ryanto/acts_as_votable/blob/599995f7ec5aa0f8a04312768fc956e9003d32d4/lib/acts_as_votable/votable.rb#L15

Попробуйте вместо этого использовать vote_up, так как он выглядит как оригинальный метод, он должен работать на версиях, где псевдоним upvote_by не был установлен.

...