将 will_paginate 与范围一起使用,未定义的方法错误

using will_paginate with scope, undefined method error

我在 ruby 应用程序中使用 will_paginate gem,大部分情况下它工作正常。但是当我没有用户登录时,我 运行 遇到了麻烦。

该应用程序是一个 reddit 类型的东西,有主题和相关的帖子和​​评论。

在我的主题模型中,我有以下内容:

class Topic < ActiveRecord::Base
  has_many :posts, dependent: :destroy

  scope :visible_to, -> (user) {user ? all : :publicly_viewable}

  scope :publicly_viewable, -> {where(public: true)}

  scope :privately_viewable, -> {where(public: false)}

end

在我的 TopicsController 中:

class TopicsController < ApplicationController
  require 'will_paginate/array'

  def index
    @topics = Topic.visible_to(current_user).paginate(page: params[:page], per_page: 10)
    authorize @topics
  end

当我点击 link to Topics 时没有 current_user,据我了解,模型中的 "user" 应该 return nil,这应该是一个功能记录。只有 publicly_viewable 个主题应该 returned。但我收到以下错误消息:

undefined method `paginate' for :publicly_viewable:Symbol

我想也许我正在处理一个数组,所以我添加了 "require 'will_paginate/array'",但这没有帮助。

有没有人有什么想法?

谢谢。

不要使用符号。直接调用作用域publicly_viewable即可。

scope :visible_to, -> (user) {user ? all : publicly_viewable}

也就是说,从根对象开始查询通常会更好。像这样:

def index
  @topics = (current_user.try(:topics) || Topic.privately_viewable).paginate(page: params[:page], per_page: 10)
end

这样您的主题就来自拥有它们的模型。这特别适合以后像这样查找资源:

def show
  @topic = current_user.topics.find_by_id(params[:id])
end

此方法可确保您找到当前用户范围内的主题,确保 he/she 实际上有 "permissions" 查看该主题。