Ruby on rails 控制器无法将实例变量传递到视图中

Ruby on rails 控制器无法将实例变量传递到视图中,ruby-on-rails,model-view-controller,instance-variables,Ruby On Rails,Model View Controller,Instance Variables,在我的主页中,我迭代对象集合,并为每个对象在表行中呈现其属性。有四个对象集合,在我的控制器中定义为实例变量,所有这些对象都会(根据使用的方法)产生以下错误之一: ActionView::Template::Error: undefined method `each_with_index' for nil:NilClass ActionView::Template::Error: undefined method `any?' for nil:NilClass “我的应用程序”视图中引发上述错误

在我的主页中,我迭代对象集合,并为每个对象在表行中呈现其属性。有四个对象集合,在我的控制器中定义为实例变量,所有这些对象都会(根据使用的方法)产生以下错误之一:

ActionView::Template::Error: undefined method `each_with_index' for nil:NilClass
ActionView::Template::Error: undefined method `any?' for nil:NilClass
“我的应用程序”视图中引发上述错误的代码是:

<table class="col-md-4 col-md-offset-1">
  <thead>
    <tr>
      <th> Rank </th>
      <th> Gamer </th>
      <th> Points </th>
    </tr>
 </thead>
 <tbody>
   <% @atp_gamers.each_with_index do |gamer, index| %>
     <tr>
       <td class="index"> <%= index+1 %> </td>
       <td class="gamer"> <%= gamer.name %> </td>
       <td class="atppoints"> <%= gamer.atpscore %> </td>
     </tr>
   <% end %>
     <tr class="current-user">
       <td> <%= @atp_gamers.to_a.index(current_user) + 1 %> </td>
       <td> <%= current_user.name %> </td>
       <td> <%= current_user.atpscore %> </td>
     </tr>
   </tbody>
</table>
<table class="col-md-4 col-md-offset-2">
  <thead>
    <tr>
      <th> Year </th>
      <th> Champion </th>
      <th> Points </th>
    </tr>
  </thead>
  <tbody>
    <% if @atp_champions.any? %>
      <% @atp_champions.each do |champion| %>
        <tr>
          <td class="year"> <%= champion.created_at.year %> </td>
          <td class="winnername"> <%= champion.name %> </td>
          <td class="winnerpoints"> <%= champion.points %> </td>
        </tr>
      <% end %>
    <% end %>
  </tbody>
</table>
登录方法定义为
!当前用户。无?

结果为零的实例变量为:
@atp\u玩家
@wta\u玩家
@atp\u冠军
@wta\u冠军
,在控制器中定义如下:

  def home
    if logged_in? && !current_user.gamer?
      ...l
    elsif logged_in? && current_user.gamer?
      @gamers = User.where(gamer: true)
      @atp_gamers = @gamers.order(atpscore: :desc).limit(50)
      @wta_gamers = @gamers.order(wtascore: :desc).limit(50)
      @atp_champions = AtpChampion.all
      @wta_champions = WtaChampion.all
      ...
    end
  end
引发错误的第一个实例变量(
each_with_index'for nil:NilClass
)是
@atp_玩家
。在视图中,我尝试使用它的显式值来更改它,即
User.where(gamer:true).order(atpscore::desc).limit(50)
,并且相应的代码被接受。更改后,Guard会为
@atp\u champions
引发一个错误

有了rails控制台,玩家们在100个用户中返回50条记录,而玩家们也不是空的
@atp_champion
@wta_champion
不是空数组,而是空数组

我怀疑这可能只是Guard提出的问题,因为rails服务器成功地呈现了视图

def home
  if logged_in?  # delete this line
  ...
  end  # delete this line
end
如果登录,请删除
,然后查看发生了什么

可能您必须在控制器中的操作:登录用户、仅:主页
之前使用
,并将
登录用户
方法定义为私有方法

如果还允许未登录的用户访问home操作,则需要在视图中使用If语句erb。像

<% if logged_in? %>
  <% @atp_gamers.each_with_index do |gamer, index| %>
  ...
<% end %>

...
--更新--

也许,它需要将变量转换为部分变量

替换

<%= render 'static_pages/gamers_home' %>


并且,将部分
@atp\u玩家
@wta\u玩家
@atp\u冠军
@wta\u冠军
替换为
atp\u玩家
wta\u冠军

试试看会发生什么

如果登录,请删除
,然后查看发生了什么

可能您必须在控制器中的操作:登录用户、仅:主页
之前使用
,并将
登录用户
方法定义为私有方法

如果还允许未登录的用户访问home操作,则需要在视图中使用If语句erb。像

<% if logged_in? %>
  <% @atp_gamers.each_with_index do |gamer, index| %>
  ...
<% end %>

...
--更新--

也许,它需要将变量转换为部分变量

替换

<%= render 'static_pages/gamers_home' %>


并且,将部分
@atp\u玩家
@wta\u玩家
@atp\u冠军
@wta\u冠军
替换为
atp\u玩家
wta\u冠军


试着看看会发生什么。

控制器不会失败传递任何内容,如果视图中的
nil
则控制器中的
nil
登录了吗?
是否总是返回false?有一个专门针对游戏玩家的主页,我目前正在开发,还有一个专门针对非游戏玩家的主页。我用这个信息更新了原始消息。两个页面都使用登录的页面?方法。非玩家主页按预期工作,是否登录?返回true。@Iceman这些变量在控制器中定义。此外,如果在视图中使用它们的显式全长值更改它们,则不会引发错误。因此,据我所知,它们的值(不是零)无法进入视图。如果视图中的值是
nil
,则它们在控制器中是
nil
,这非常简单。您只需使用消去法找出为什么它是
nil
。可能会删除视图和控制器中的所有行,并以这种方式跟踪错误。控制器不会失败传递任何内容,如果视图中的
nil
,则控制器中的
nil
登录了吗?
是否总是返回false?有一个专门针对游戏玩家的主页,我目前正在开发,还有一个专门针对非游戏玩家的主页。我用这个信息更新了原始消息。两个页面都使用登录的页面?方法。非玩家主页按预期工作,是否登录?返回true。@Iceman这些变量在控制器中定义。此外,如果在视图中使用它们的显式全长值更改它们,则不会引发错误。因此,据我所知,它们的值(不是零)无法进入视图。如果视图中的值是
nil
,则它们在控制器中是
nil
,这非常简单。您只需使用消去法找出为什么它是
nil
。可能会删除视图和控制器中的所有行,并以这种方式跟踪错误。我收到以下错误:ActionView::Template::error:未定义的局部变量或方法“atp#U gamers”,您的意思是@atp_玩家集
在视图中。并删除“\u gamers\u home.html.erb”(当然需要备份)中的所有代码,只保留
。如果页面显示“Successfully Get variable!”之后,应用程序本身工作正常。我收到以下错误:ActionView::Template::error:未定义的局部变量或方法“atp#U gamers”for#你的意思是什么@atp_玩家集
在视图中。并删除“\u gamers\u home.html.erb”(当然需要备份)中的所有代码,只保留
。如果在此之后页面可以显示“成功获取变量!”,则应用程序本身工作正常。