2012-06-12 1 views
1

"사용자"가 속할 수있는 그룹 목록을 저장하는 "그룹"과 같은 테이블이 있습니다. User 모델에서는 belongs_to :group을 사용합니다. 내 견해로, 그룹 이름을 표시하고 싶습니다. 나는 @user.group.name으로 해보려고합니다.ActiveRecord 연결이 nil 일 때 레일즈가 오류를 방지합니다.

모든 사용자가 그룹에 할당되는 것은 아니므로 @user.groupnil입니다. 그래서 나는 NoMethodError: undefined method 'name' for nil:NilClass을 얻지 못한다.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

답변

3

하는 것과 같습니다는 코드를 재사용하기 쉬운 것, 그래서

@user.group.try(:name) # returns nil if @user.group is nil 
4

가장 간단한 방법은 다음과 같이 뭔가를하는 것입니다 :

<% if @user.group.present? %> 
    <%= @user.group.name %> 
<% end %> 

그러나, Law of Demeter에 따라, 모델은 그 협회의 방법에 대해 알고 안 /이 즉시 협회에 이야기해야합니다.

따라서, 이상적으로, 당신은 (당신의 사용자 모델)과 같이해야합니다 : 당신이 다음 @user.group_name를 통해 액세스 할 수

delegate :name, :to => :group, :prefix => true, :allow_nil => true 

합니다. 연관된 그룹이 없지만 예외를 발생시키지 않으면 nil을 리턴합니다. 이것은 내가 일반적으로 이것에 대한 Object#try를 사용

def group_name 
    group.try(:name) 
end 
0

나는 좋은 이름을 가진 메서드를 만들 것입니다.

def is_assigned? 
    self.group 
end 

<% if @user.is_assigned? %> 
    ... 
<% end %> 
관련 문제