3

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

1 回答 1

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将被传递给视图,并使用它们完成某些操作。

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

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

所以简而言之,任何你想在视图中访问的东西,都需要在控制器中声明。并且无论何时你想从一个方法中返回一些东西,总是让它返回信息给你。

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

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

因此,如果您愿意,您可以以这种方式简化它,但我建议的按照您的方式修复它的方法也可以,但您更喜欢。

我希望我的解释有所帮助,并且不要太啰嗦。

于 2012-06-14T11:44:40.630 回答