从不同的控制器渲染视图 NilClass 错误

Rendering view from different controller NilClass Error

我正在尝试在不同的控制器视图中呈现视图,但我得到:

undefined method `each' for nil:NilClass

我将 'views/users/show' 中的视图渲染为:

<%= render :template => 'groups/index' %>

视图本身位于 'views/groups/index':

<% @groups.each do |group| %>
  <li>
    <%= group.name %>
    <%= group.description %>
  </li>
<% end %>

我的索引组控制器如下所示:

def index
  @groups = Group.all
end

我认为我渲染视图的方式存在问题,因为如果我在我的索引控制器中创建一个实例变量并在视图中调用它,它就不会出现。我的数据库中 table 组中有条目。

如有任何帮助,我们将不胜感激。

提前致谢。

我认为用 partial: 参数替换 template: 应该就足够了。

试试这个:

<%= render partial: 'groups/index' %>

你必须 rename/copy groups/index.html.erbgroups/_index.html.erb

这仅适用于呈现视图,但不会实现您的 GroupsController.

的功能

编辑

您必须重新定义 UsersController

中的组
# UsersController
def index
  @groups = Group.all
end

根据您需要向用户展示所有这些组的次数,这可能会变得难以维护。如果经常使用,可以考虑添加

# i.e. ApplicationController
def groups
  Group.all
end

在你的 ApplicationController 中(或者你想包含在不同控制器中的一些模块)。然后你可以打电话

# UsersController
def index
  @groups = groups
end

仍然<%= render partial: 'groups/index' %>

变化:

<%= render :template => 'groups/index' %>

收件人:

<%= render 'groups/index' %>

并确保索引操作的文件名是 _index.html.erb 而不是 index.html.erb.

编辑

当您呈现视图时,您只是在呈现模板,这确实会调用对您的索引操作的请求。您必须在初始视图的操作中定义 @groups