2016-06-21 248 views
0

我是Ruby on Rails开发的新手,我一直在调整www.railstutorial.org的指南来学习这门语言。这里是我的情况:用will_paginate过滤搜索结果

我有开始了这样一个指数函数:

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]) 

。这些搜索查询完全给我我在轨控制台后的内容,例如:

User.where(team_id: 1).take(50) 

返回我期望的结果。此外,如果我删除@filter并更改代码,如下所示:

def index 
    @users = User.where(team_id: current_user.team_id).all 
end 

它可以很好地工作。 为什么没有分页时,它是用户的问题。所有,但只要传到比整个桌子还少,它就会吓倒了?我认为这是因为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 

回答

2

当你做User.all轨将其转换为用户对象的数组。 尝试User.all.class,你会明白。可以使用User.where(true)。这应该工作并获取所有用户记录。

2

在你的控制器中加入这一行

require 'will_paginate/array' 

,然后再次尝试