Я пытаюсь создать клон 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 как поддерживаемые версии.
Если бы кто-нибудь мог пролить свет на это, это было бы очень признательно.