我在模型中有我的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
答案 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
所以如果你愿意的话,你可以这样简化它,但是我建议用你的方式修复它的方法也会起作用,无论你喜欢什么。
我希望我的解释有所帮助,并且不会太长篇大论。