Ruby on rails数组到HTML表

问题描述 投票:-1回答:4

嗨,我尝试了很多代码并阅读了大量文档,我总是犯同样的错误

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>

谢谢你的帮助!

html ruby-on-rails ruby
4个回答
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
投票

@myarrmyarr不同。你必须将myarr = [...]改为@myarr = [...]

此外,如果{ville_id: '1', ville_name: 'Paris', population: 2000000, pays: 'France'}Hash(不是ClassOpenStruct)更新视图:

   <% @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 %>

0
投票

拿实例变量@myarr而不是myarr你在视图中定义了@myarr是正确的,在控制器动作中将myarr更改为@myarr


0
投票

如果你只在视图中使用@myarr并且在控制器逻辑中不需要它,我相信她会成为助手的角色,你可以简单地在帮助器中定义一个方法(application_helper.rbpage_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,希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.