Ruby on rails 3 卡米纳里没有';如果我的查询在模型中,则无法工作

Ruby on rails 3 卡米纳里没有';如果我的查询在模型中,则无法工作,ruby-on-rails-3,pagination,mongoid,kaminari,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 我在这里使用它是因为我的集合名称是作为参数传递的,并且我没有所有集合的模型。相反,我有一个模型,并根据请求参数动

我在模型中有我的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 %>

我认为当你在模型中调用变量时,它正在丢失。相反,让它将对象返回给您,如下所示:

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
)将被传递到视图中,并对它们进行处理

另一方面,从技术上讲,您并不是在控制器中声明和实例化该变量,而是在模型中按照上面发布的源代码进行声明和实例化。在那里声明变量是可以做到的,但是它没有用,因为控制器甚至不知道它发生了。当您告诉类集合执行一个方法时,通常您会让该方法返回一些东西给您,如果您不这样做,那么变量就会丢失

这类似于我让某人去商店给我买一些食品,你做了正确的事情,给了方法所需的所有信息,给了它正确的变量来正确地完成它的工作,但没有告诉它实际带着它们回来,这就是错误发生的地方。按照您的方法,食品杂货在商店购买并留在那里。我为您编写的修改后的函数告诉它随食品一起返回,并将它们放入变量
@result\u pg
。变量在控制器中的声明与预期的一样

因此,简而言之,您希望在视图中访问的任何内容都需要在控制器中声明。任何时候你想要从一个方法中得到一些东西,总是让它把信息返回给你

此外,甚至不完全需要对类集合进行方法调用。在我自己的一个使用Kaminari的项目中,我只需在控制器中执行整个调用,如下所示:

@notes = current_user.notes.page params[:page]
// My Application has :users that have_many :notes
如果你愿意的话,你可以简化它,但是我建议用你现在的方式修复它的方法也可以,不管你怎么想


我希望我的解释有帮助,不要太冗长。

谢谢。。它成功了,你知道为什么变量丢失了吗。@AbhayKumar我更新了我的答案,以帮助解释为什么我的修复有效。我希望这会有帮助。
@notes = current_user.notes.page params[:page]
// My Application has :users that have_many :notes