簡體   English   中英

Ruby on Rails - 使用acts_as_votable gem 時“nil:NilClass 的未定義方法‘[]’”

[英]Ruby on Rails - "undefined method `[]' for nil:NilClass" when using acts_as_votable gem

我正在嘗試創建一個 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 %>
...

但是當我嘗試對帖子進行投票時,我得到了

PostsController 中的 NoMethodError#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,並且acts_as_votable的 GitHub 頁面僅將5.05.1列為受支持的版本。

如果有人能對此有所了解,將不勝感激。

upvote_by似乎是一個別名vote_up ,也許你不使用本教程相同的寶石版本?

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

嘗試使用vote_up代替,因為它看起來像原始方法,它應該適用於未設置upvote_by別名的版本。

嗨 它已經很長時間了,但我認為您可能沒有在控制器中設置您的帖子。

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

該錯誤告訴您,您正在嘗試對尚未設置的類進行投票。 你必須在控制器中設置類

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM