将 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" 查看该主题。
我在 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" 查看该主题。