Ruby on Rails使用will_paginate报(given 2, expected 1)错误如何解决
报错指向视图中will_paginate @articles, :container => false这行代码,你给will_paginate方法传了2个参数(分页集合@articles、配置项:container => false),但当前项目中生效的will_paginate方法只接受1个入参,所以触发参数错误。
错误原因
- 最常见的场景是Gemfile中同时引入了
will_paginate和kaminari两个分页插件,两者的helper方法存在命名冲突:kaminari内置的will_paginate兼容方法仅支持1个集合参数,不接收额外配置项,会覆盖will_paginate原生的方法实现。 - 第二种可能是项目内自定义了
will_paginatehelper方法(通常在app/helpers目录下的文件中定义),重写了插件的原生实现,且自定义方法仅声明了1个入参。 - 第三种为使用的will_paginate版本过旧,旧版本不支持传入额外配置参数。
对应解决方案
- 优先检查Gemfile是否同时存在
kaminari和will_paginate:- 若无需同时使用,删除不需要的分页插件对应的gem条目,执行
bundle install后重启服务即可。 - 若必须同时使用两个插件,可在config/initializers目录下新建
kaminari_config.rb配置文件,添加以下代码修改kaminari的方法名避免冲突:
配置完成后重启服务即可。Kaminari.configure do |config| config.page_method_name = :kaminari_page config.param_name = :kaminari_page end
- 若无需同时使用,删除不需要的分页插件对应的gem条目,执行
- 若不存在多插件冲突,全局搜索项目代码中是否有自定义的
will_paginate方法定义,删除自定义方法或修改方法定义支持接收可变参数即可。 - 若为版本过旧问题,将Gemfile中will_paginate的版本指定为最新稳定版:
执行gem 'will_paginate', '~> 4.0'bundle update will_paginate后重启服务即可。
额外优化提示
你的控制器index方法中@articles = Article.all为冗余代码,会被下一行的paginate查询结果直接覆盖,可以直接删除。
内容的提问来源于stack exchange,提问作者Murat Çiçek
相关产品推荐
相关产品推荐

