嗨,我尝试了很多代码并阅读了大量文档,我总是犯同样的错误
nil
的未定义方法`each':NilClass
我的代码conttrollers / pages_controller.rb:
class PagesController < ApplicationController
myarr = [{ville_id: '1', ville_name: 'Paris', population: 2000000, pays: 'France'},
{ville_id: '2', ville_name: 'Madrid', population: 3000000, pays: 'Espagne'},
{ville_id: '3', ville_name: 'Marrakech', population: 1000000, pays: 'Maroc'},
{ville_id: '4', ville_name: 'Tokyo', population: 9000000, pays: 'Japon'},
{ville_id: '5', ville_name: 'Istanbul', population: 15000000, pays: 'Turquie'}]
end
我的erb html代码布局/ pages / listing.html.erb:
<table class="table table-condensed">
<thead>
<tr>
<th>Ville Id</th>
<th>Ville</th>
<th>Population</th>
<th>Pays</th>
</tr>
</thead>
<tbody>
<% @myarr.each do |myarr| %>
<tr>
<td><%= myarr.ville_id %></td>
<td><%= myarr.ville_name %></td>
<td><%= myarr.population %></td>
<td><%= myarr.pays %></td>
</tr>
<% end %>
</tbody>
</table>
谢谢你的帮助!
我认为您不能在控制器实例范围之外使用实例变量。在你使用它的方式中,你只能将它声明为一个类变量(即@@my_arr
),你可能不想这样做。
相反,你应该在一个方法中包装@my_arr
的声明:
class PagesController < ApplicationController
def listing
@my_arr = [{ville_id: '1', ville_name: 'Paris', population: 2000000, pays: 'France'},
{ville_id: '2', ville_name: 'Madrid', population: 3000000, pays: 'Espagne'},
{ville_id: '3', ville_name: 'Marrakech', population: 1000000, pays: 'Maroc'},
{ville_id: '4', ville_name: 'Tokyo', population: 9000000, pays: 'Japon'},
{ville_id: '5', ville_name: 'Istanbul', population: 15000000, pays: 'Turquie'}]
end
end
该方法被命名为listing
以与视图对应。
另外,正如其他人提到的那样,你正在创建Hash
对象,并且通过[]
方法访问这些对象的属性(是的,[]
是一种方法!),即myarr[:ville_id]
,myarr[:ville_name]
等)。
@myarr
与myarr
不同。你必须将myarr = [...]
改为@myarr = [...]
。
此外,如果{ville_id: '1', ville_name: 'Paris', population: 2000000, pays: 'France'}
是Hash
(不是Class
或OpenStruct
)更新视图:
<% @myarr.each do |myarr| %>
<tr>
<td><%= myarr[:ville_id] %></td>
<td><%= myarr[:ville_name] %></td>
<td><%= myarr[:population] %></td>
<td><%= myarr[:pays] %></td>
</tr>
<% end %>
拿实例变量@myarr
而不是myarr
你在视图中定义了@myarr
是正确的,在控制器动作中将myarr
更改为@myarr
如果你只在视图中使用@myarr
并且在控制器逻辑中不需要它,我相信她会成为助手的角色,你可以简单地在帮助器中定义一个方法(application_helper.rb
或page_helper.rb
),我更喜欢为它创建一个帮手。像这样的控制器:
module PageHelper
def my_list
[{ville_id: '1', ville_name: 'Paris', population: 2000000, pays: 'France'},
{ville_id: '2', ville_name: 'Madrid', population: 3000000, pays: 'Espagne'},
{ville_id: '3', ville_name: 'Marrakech', population: 1000000, pays: 'Maroc'},
{ville_id: '4', ville_name: 'Tokyo', population: 9000000, pays: 'Japon'},
{ville_id: '5', ville_name: 'Istanbul', population: 15000000, pays: 'Turquie'}]
end
end
然后这将清除你的控制器,在view
你必须像这样使用它:
<% my_list.each do |myarr| %>
<tr>
<td><%= myarr.ville_id %></td>
<td><%= myarr.ville_name %></td>
<td><%= myarr.population %></td>
<td><%= myarr.pays %></td>
</tr>
<% end %>
当然你可以通过给它params定制my_list
并让它按你喜欢的方式工作,我更喜欢这种方式,但是请记住,只有在视图层中才需要这个实例变量@myvar
,希望这会有所帮助。