【问题标题】:using will_paginate with scope, undefined method error使用 will_paginate 与范围,未定义的方法错误
【发布时间】:2015-02-24 02:55:39
【问题描述】:

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

该应用是 reddit 类型的东西,有主题和相关的帖子和​​ cmets。

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

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

在我的主题控制器中:

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

当我点击没有 current_user 的主题链接时,据我了解,模型中的“用户”应该返回 nil,这应该是一个功能记录。只应返回public_viewable 主题。但我收到以下错误消息:

undefined method `paginate' for :publicly_viewable:Symbol

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

有人有什么想法吗?

谢谢。

【问题讨论】:

    标签: ruby-on-rails will-paginate


    【解决方案1】:

    不要使用符号。直接调用作用域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
    

    这种方法可确保您找到当前用户范围内的主题,确保他/她实际上拥有查看该主题的“权限”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-27
      • 2017-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-11
      • 1970-01-01
      相关资源
      最近更新 更多