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”(当然需要备份)中的所有代码,只保留
。如果在此之后页面可以显示“成功获取变量!”,则应用程序本身工作正常。