Ruby on Rails-使用acts_as_votable gem时,“未定义的方法“ []”为nil:NilClass”

时间:2018-09-08 16:43:19

标签: ruby-on-rails ruby nomethoderror acts-as-votable

我正在尝试创建Reddit克隆,其中用户以及upvote和downvote帖子。我已经为 acts_as_votable gem(https://github.com/ryanto/acts_as_votable)安装并运行了必要的迁移:

groupByKey

我还应该提到,我正在使用单表继承来简化每种类型的帖子的工作:

# 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

我尝试实现upvote / downvote功能(http://www.mattmorgante.com/technology/votable):

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

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

但是当我尝试对帖子进行投票时,我得到了

PostsController#upvote中的NoMethodError

未定义的方法“ []”,用于nil:NilClass

在我的控制器的这一行:

# 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 %>
...

即使我在不​​使用 current_user 的情况下在控制台中手动尝试,也会收到相同的错误:

@post.upvote_by current_user

我不确定我的代码是否存在问题,或者可能是兼容性问题,因为我正在使用Rails 5.2.0 和GitHub页面的 acts_as_votable 仅列出 5.0 5.1 作为受支持的版本。

如果有人可以对此有所了解,将不胜感激。

2 个答案:

答案 0 :(得分:0)

upvote_by似乎是vote_up的别名,也许您没有使用本教程中相同的gem版本?

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

请改用vote_up,因为它看起来像原始方法,因此应该在未设置upvote_by别名的版本上工作。

答案 1 :(得分:0)

嗨,好长时间了,但我想您可能没有在控制器中设置过帖子。

NoMethodError in PostsController#upvote
undefined method `[]' for nil:NilClass

该错误告诉您您要对尚未设置的课程进行投票。您必须在控制器中设置类

before_action :set_post, only: [:show, :edit, :update, :destroy, :upvote, :downvote]