2011-01-17 15 views
3

非常に単純なレール3アプリケーションを設定して、レガシーMySQLデータベースのデータを表示します。レガシーデータベースは、主に外部キーフィールドが複数化されていることを除いて、ORM互換のレールです。たとえば、 "orders"テーブルには、 "companies_id"というよりむしろ "companies"というテーブルの外部キーフィールドがあります。だから自然に私は ":foreign_key"属性 "belongs_to"を使用して手動でフィールド名を設定する必要があります。未定義のメソッド `code 'for nil:レールとレガシーデータベースを含むNilClassメッセージ

私は数年の間にレールを使用していないが、私は右のすべてをやっているかなり確信している、まだ「order.currency.code」にアクセスしようとすると、私は次のエラーを取得する:

undefined method `code' for nil:NilClass 

これはこれまでの非常に単純なアプリケーションです。私が行った唯一のことは、レガシーデータベーステーブルごとにアプリケーションと足場の束を生成することです。そして、モデルのいくつかに入って、上記のデータベース命名規則の違いに対応するための調整を行い、いくつかのフィールドをビューに追加しました。それでおしまい。面白いビジネスはありません。

だから私のデータベーステーブルは、この(唯一の関連分野)のようになります。

orders 
------ 
id 
description 
invoice_number 
currencies_id 

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

私の注文モデルは次のようになります。

class Currency < ActiveRecord::Base 
    has_many :orders 
end 

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

マイ通貨モデルは次のようになります

関連する表示スニペットは次のようになります。

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

私は完全にアイデアがありません。助言がありますか?

答えて

3

ほとんどの場合、何らかの注文の外部キーが設定されていないために発生します。あなたは右のエラー行の前に、ログに外部キー(currencies_id)の値を印刷することができ、確認するには、この

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

それとも<% if order.currency.nil? %> ... <% else %> ... <% end %>

平野のようなあなたのビューでそれを扱うことができます。

+0

ああ、それは今私に戻ってきています。私は長年に渡ってレールを使い始めたとき、これらのヌルの問題に苦労していることを覚えています。どうもありがとうございました。それがそれでした。 –

+0

あなたの語義は、その外部キーの必要性を無関係にしないでしょうか?また、おそらくorder.currency.blankを使用したいでしょうか?または逆order.currency.present?それを捕まえるか、2つ以上の属性を持たせて、その上にnilを指定するだけです。 – pjammer

4

また、ruby 1.9.2で動作するrails 3 appに入っているので、潜在的にゼロである可能性のある属性にはorer.currency.try(:code)を使用することもできます。そしてエラーはNikita Rybakのように指摘されています

関連する問題