неопределенный метод `code 'для nil: сообщение NilClass с рельсами и устаревшей базой данных - PullRequest
3 голосов
/ 18 января 2011

Я устанавливаю очень простое приложение rails 3 для просмотра данных в устаревшей базе данных MySQL.Устаревшая база данных в основном совместима с рельсами ORM, за исключением того, что поля внешнего ключа являются множественными.Например, в моей таблице «заказы» есть поле внешнего ключа к таблице «компании» под названием «companies_id» (а не «company_id»).Поэтому, естественно, мне приходится использовать атрибут «: foreign_key» для «assign_to», чтобы установить имя поля вручную.

Я не использовал рельсы в течение нескольких лет, но я уверен, что 'Я все делаю правильно, но я получаю следующую ошибку при попытке доступа к «order.currency.code»:

undefined method `code' for nil:NilClass

Это пока очень простое приложение.Единственное, что я сделал, - это сгенерировал приложение и связку для каждой из устаревших таблиц базы данных.Затем я углубился в некоторые из моделей, чтобы внести коррективы, чтобы учесть вышеупомянутое различие в соглашениях об именах баз данных, и добавил некоторые поля к представлениям.Вот и все.Нет ничего смешного.

Так что мои таблицы базы данных выглядят так (только соответствующие поля):

orders
------
id
description
invoice_number
currencies_id

currencies
----------
id
code
description

Модель моего заказа выглядит следующим образом:

class Order < ActiveRecord::Base
  belongs_to :currency, :foreign_key=>'currencies_id'
end

Моя валютаМодель выглядит следующим образом:

class Currency < ActiveRecord::Base
    has_many :orders
end

Соответствующий фрагмент представления выглядит следующим образом:

<% @orders.each do |order| %>
  <tr>
    <td><%= order.description %></td>
    <td><%= order.invoice_number %></td>
    <td><%= order.currency.code %></td>
  </tr>
<% end %>

У меня совершенно нет идей.Есть предложения?

Ответы [ 2 ]

4 голосов
/ 18 января 2011

Или, поскольку вы находитесь в приложении rails 3, которое работает на ruby ​​1.9.2, вы также можете использовать orer.currency.try(:code) для таких атрибутов, которые могут быть равны нулю. И ошибка такая же, как и у Никиты Рыбака

3 голосов
/ 18 января 2011

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

<%= order.currency.nil? ? 'no currency' : order.currency.code %>

Или просто просто <% if order.currency.nil? %> ... <% else %> ... <% end %>

Чтобы проверить, вы можете напечатать значение внешнего ключа (currencies_id) в журнал, вернодо строки ошибки.

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