使用will_paginate

时间:2016-06-21 06:18:50

标签: ruby-on-rails

我是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

2 个答案:

答案 0 :(得分:2)

执行User.all后,rails会将其转换为User对象数组。 试试User.all.class即可明白。

您可以使用User.where(true)。这应该可以工作并获取所有用户记录。

答案 1 :(得分:2)

在您的控制器中添加此行

  require 'will_paginate/array'

然后再试一次