Array # zip не работает (неопределенный метод для nil: NilClass) - PullRequest
0 голосов
/ 21 октября 2018

Я пытаюсь сделать таблицу из 2 разных наборов данных

Мой контроллер

@data = CompanyBorrower.find(params[:id])
@data1= @data.childs.all
@data2= @data.parents.all

Таблица (фрагмент)

            <% @data1.zip(@data2) do |f1,f2| %>
              <tr>
                <td><%= f1.company_borrower1.name %></td>
                <td><%= f2.company_borrower2.name %></td>
              </tr>
            <% end %>

НоЯ получаю "неопределенный метод` company_borrower2 'для nil: NilClass ".Если я удаляю один или другой набор данных, он работает нормально.

Мне кажется, я знаю проблему;Я думаю, что это потому, что «data1» возвращает 5 строк, в то время как «data2» будет иметь 1 строку.Если я переключаюсь, это работает, но я получаю только одну строку!

Так что я (думаю) знаю проблему, но не знаю, как ее решить?

Редактировать - Обновлено

Обратите внимание, что company_borrower1 и company_borrower2 используют одну и ту же модель -

Модель CompanyBorrower

has_many :childs, :class_name => 'Parent', :foreign_key => 'company_borrower_id'
has_many :parents, :class_name => 'Parent', :foreign_key => 'company_borrower_id1'

Родительская модель

belongs_to :company_borrower1, :class_name => 'CompanyBorrower', :foreign_key => :company_borrower_id
belongs_to :company_borrower2, :class_name => 'CompanyBorrower', :foreign_key => :company_borrower_id1

ОБНОВЛЕНИЕ 2

Если я сделаю следующее, он прекрасно работает, но размещает столбцы в строках.Я могу работать с этим, но все же предпочел бы знать, как добиться моего первоначального вопроса для дальнейшего использования

              <tr>
                <% @data1.each do |f1| %><td><%= f1.company_borrower1.name %></td><% end %>
              </tr>
              <tr>
                <% @data2.each do |f1| %><td><%= f1.company_borrower2.name %></td><% end %>
              </tr>

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

если вы используете ruby ​​2.3 или более позднюю версию, вы можете использовать Безопасный оператор навигации (&.) вместо try method

        <% @data1.zip(@data2) do |f1,f2| %>
          <tr>
            <td><%= f1&.company_borrower1&.name %></td>
            <td><%= f2&.company_borrower2&.name %></td>
          </tr>
        <% end %>

оператор безопасной навигации (&.) вернет nil, если объект равен nil, в противном случае он вызывает метод объекта .. Так что, если вы используете оператор безопасной навигации, вам нужно убедиться, что он будетвызывается для всех методов. Например, я использовал оператор безопасной навигации для объекта f2, f2 & .company_borrower2 вернет nil, но здесь мы вызываем метод имени agin для возвращаемого значения f2 & .company_borrower2.So в oreder, чтобы избежать ошибки, нам нужно вызвать оператора безопасной навигации agian.

То же самое относится к использованию try метода

       <% @data1.zip(@data2) do |f1,f2| %>
          <tr>
            <td><%= f1.try(:company_borrower1).try(:name) %></td>
            <td><%= f2.try(:company_borrower2).try(:name) %></td>
          </tr>
        <% end %>
0 голосов
/ 21 октября 2018

Моим диким предположением было бы использовать try для того, что было возвращено.Поэтому вместо этого:

<td><%= data1.name %></td>
<td><%= data2.name %></td>

Вы должны сделать что-то вроде:

<td><%= data1.try(:name) %></td>
<td><%= data2.try(:name) %></td>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...