2011-01-17 5 views
3

레거시 MySQL 데이터베이스에서 데이터를보기 위해 매우 간단한 레일 3 애플리케이션을 설정하고 있습니다. 레거시 데이터베이스는 대부분 외래 키 필드가 복수형 인 것을 제외하고는 ORM 호환 레일입니다. 예를 들어, 내 "주문"테이블에는 "회사"테이블 ("company_id"가 아닌) "회사 _ 테이블"에 대한 외래 키 필드가 있습니다. 그래서 자연스럽게 "belongs_to"의 ": foreign_key"속성을 사용하여 수동으로 필드 이름을 설정해야합니다.정의되지 않은 메소드`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 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 %> 

나는 완전히 아이디어가 없습니다. 어떤 제안?

답변

3

대부분의 경우 일부 주문의 외래 키가 설정되지 않았기 때문에 이러한 상황이 발생합니다. 당신이 바로 오류 라인 전에 로그에 외래 키 (currencies_id)이

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

또는 <% if order.currency.nil? %> ... <% else %> ... <% end %>

확인하려면 그냥 일반, 인쇄 할 수 값처럼보기에서 처리 할 수 ​​있습니다.

+0

아, 이제 다 나에게 돌아오고 있습니다. 나는 처음 몇 년 동안 레일을 사용하기 시작했을 때 이러한 null 문제로 어려움을 겪었던 것을 기억합니다. 고맙습니다. 그랬어. –

+0

당신의 굴절은 그 외래 키에 대한 필요성을 부적절하게 만들지 않을까요? 또한 order.currency.blank를 사용하고 싶습니까? 또는 역순으로 order.currency.present? 그냥 두 개 이상의 속성을 포착하게하고 그 위에는 아무 것도 붙이지 않게됩니다. – pjammer

4

또는 ruby ​​1.9.2에서 실행되는 레일 3 앱에 있기 때문에 가능성이없는 이러한 속성에 orer.currency.try(:code)을 사용할 수도 있습니다. 그리고 오류는 Nikita Rybak에 의해 지적되었습니다.

관련 문제