嗨,我尝试了很多代码并阅读了很多文档之后,我总是遇到相同的错误
nil
:NilClass
的未定义方法“ each”
我的代码控制者/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>
感谢您的帮助!
答案 0 :(得分:2)
@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 %>
答案 1 :(得分:2)
我认为您不能在控制器实例范围之外使用实例变量。在使用它的方式中,您只能将其声明为类变量(即@@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]
等)。
答案 2 :(得分:0)
采用实例变量@myarr
而非仅使用myarr
您在正确的视图中定义了@myarr
,在控制器操作中将myarr
更改为@myarr
答案 3 :(得分:0)
如果仅在视图中使用@myarr
,而在控制器逻辑中不需要它,我相信她会成为 Helpers 的角色,您可以在帮助器(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 %>
当然,您可以通过给my_list
赋予参数来使其自定义,并使其按自己的意愿工作,我更喜欢这种方式,但是请记住,只有在视图层中仅需要此实例变量@myvar
时,希望这会有所帮助。