Массив Ruby on rails в HTML таблицу - PullRequest
0 голосов
/ 29 августа 2018

Привет, после того, как я попробовал много кода и прочитал много документации, у меня всегда одна и та же ошибка

неопределенный метод `each 'для nil: NilClass

Мой код контроллеров / 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 / list.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 голосов
/ 29 августа 2018

Если вы используете @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 %>

Конечно, вы можете настроить my_list, задав ему параметры и заставить его работать так, как вам нравится, я предпочитаю этот способ, но помните, когда только эта переменная экземпляра @myvar необходима только в слое вида, надеюсь, это поможет.

0 голосов
/ 29 августа 2018

@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 %>
0 голосов
/ 29 августа 2018

Я не думаю, что вы можете использовать переменную экземпляра вне области действия экземпляра контроллера. Если вы используете его, вы можете объявить его только как переменную класса (т.е. @@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] и т. д.).

0 голосов
/ 29 августа 2018

Взять переменную экземпляра @myarr вместо myarr Вы определили @myarr в представлении, которое является правильным, Измените myarr на @myarr в действии контроллера

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...