Ruby on Rails数组到HTML表

时间:2018-08-29 13:26:01

标签: html ruby-on-rails ruby

嗨,我尝试了很多代码并阅读了很多文档之后,我总是遇到相同的错误

  

nilNilClass的未定义方法“ 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>

感谢您的帮助!

4 个答案:

答案 0 :(得分: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 %>

答案 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.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 %>

当然,您可以通过给my_list赋予参数来使其自定义,并使其按自己的意愿工作,我更喜欢这种方式,但是请记住,只有在视图层中仅需要此实例变量@myvar时,希望这会有所帮助。