Kaminari不起作用如果我的查询在模型中

时间:2012-06-14 04:42:19

标签: ruby-on-rails-3 pagination mongoid kaminari

我在模型中有我的mongoid查询

def self.get_result collection_name, hash_params, page, per_page 
  self.collection_name = collection_name
  @result_pg = self.where(hash_params).page(page).per(per_page)
end

我在这里有它,因为我的集合名称作为参数传递,我没有所有集合的模型。相反,我有一个模型,我根据请求参数动态设置其名称。

我的控制器代码

Collection.get_result params[:state], hash_param, params[:page], params[:per]

我的观看代码

<%= paginate @result_pg %>

当我使用上面的代码时,我得到了

undefined method `current_page' for nil:NilClass   ERROR

1 个答案:

答案 0 :(得分:4)

我认为当你在模型中调用它时,变量会丢失。相反,让它像这样将对象返回给你:

return self.where(hash_params).page(page).per(per_page) // put this in your model

然后,我是控制器,连接各个部分:

@result_pg = Collection.get_result params[:state], hash_param, params[:page], params[:per] 
// in your controller like so

现在,控制器没有设置@result_pg,这就是为什么它是nil而你得到的nil错误。试试这个,让我知道这是否适合你。

<强>更新

好的,至于这种情况发生的原因。当Rails加载一个控制器时,你用@符号声明的变量(如@bologna)将传递给视图,并且会对它们进行一些操作。

另一方面,根据您在上面发布的源代码,您在技术上并未声明并在控制器中实例化该变量,而是在模型中执行此操作。声明变量可以完成,但它没有用,因为控制器不知道它甚至发生了。当你告诉Class Collection执行一个方法时,通常你会让那个方法返回给你一些东西,如果你没有,那么变量就会丢失。

类似于我要求某人去商店给我买些杂货,你做了正确的事情,给了方法所需的所有信息,传递正确的变量来正确地完成工作,但不告诉它实际上与它们一起回来,是错误发生的地方。在您的方法中,杂货在商店购买并留在那里。我为你写的修改后的函数告诉它返回杂货并将它们放在变量@result_pg中。变量在Controller中声明,就像它应该的那样。

简而言之,您希望在视图中可以访问的任何内容都需要在控制器中声明。无论什么时候你想要一个方法的东西,总是让它将信息返回给你。

此外,即使对类集合进行方法调用也不是完全必要的。在我自己使用Kaminari的项目中,我只是简单地在控制器中执行整个调用,如下所示:

@notes = current_user.notes.page params[:page]
// My Application has :users that have_many :notes

所以如果你愿意的话,你可以这样简化它,但是我建议用你的方式修复它的方法也会起作用,无论你喜欢什么。

我希望我的解释有所帮助,并且不会太长篇大论。