我是Ruby on Rails开发的新手,我一直在调整www.railstutorial.org的指南来学习这门语言。这是我的情况:
我有一个像这样开始的索引函数:
def index
@users = User.paginate(page: params[:page])
end
此代码显示页面上数据库中的所有用户。但是,我的用户是团队成员(由用户的team_id列显示),我希望登录用户只能看到他们的团队成员。所以,使用我所知道的并进行实验,我尝试了这个:
def index
@filter = User.all
@users = @filter.paginate(page: params[:page])
end
我很受鼓舞,因为页面继续正常工作。但是,只要我向@filter添加任何类型的实际查询或方法,我就会在浏览器中收到以下错误:
undefined method `paginate' for #<Array:0x00000001b18a90>
它标识了行
@users = @filter.paginate(page: params[:page])
作为问题。这些搜索查询给出了我在rails控制台中的确切内容,例如:
User.where(team_id: 1).take(50)
返回我期望的结果。另外,如果我删除@filter并按如下方式更改代码:
def index
@users = User.where(team_id: current_user.team_id).all
end
它完美无缺。 为什么paginate在用户时没有问题。所有这一切,但只要它比整张桌子还小,它就会吓坏了吗?
(编辑:在经过一些实验之后,我认为这是因为will_paginate希望能够将表格移交给我,我已经获得了我希望它具有的功能,但我认为其他人可能会回答这个问题,所以我我还是把它留下来了。另外,任何有关为什么下面的代码适用于will_paginate而不是之前的代码的任何见解都不会受到赞赏。
解决方案(包括测试,看看用户是否是管理员,谁需要能够看到所有团队):
def index
if @current_user.admin == true
@users = User.paginate(page: params[:page])
else
@filter = User.where(team_id: current_user.team_id).all
@users = @filter.paginate(page: params[:page])
end
end
答案 0 :(得分:2)
执行User.all
后,rails会将其转换为User对象数组。
试试User.all.class
即可明白。
您可以使用User.where(true)
。这应该可以工作并获取所有用户记录。
答案 1 :(得分:2)
在您的控制器中添加此行
require 'will_paginate/array'
然后再试一次