2011-08-09 3 views
0

지금은 프로파일 데이터를 저장하기위한 Rails 3 모델이 있습니다. 사용자가 프로필 사진을 표시하도록 선택하면 해당 데이터베이스 테이블의 열 중 하나에 이미지 URL이 포함됩니다 (페이스 북과 로그인 할 때 Facebook 프로필 API와 통합되어 사용자의 프로필 사진 URL을 저장하지만 관련이 없습니다). 내가 겪고있는 문제는 이미지 열이 0 일 때 내 서버의 기본 경로로 설정하는 방법이 필요하다는 것입니다. 마이그레이션 또는 모델에서는 기본값을 사용할 수 없습니다. 내 생각은 after_find을 사용했지만 다음은 작동하지 않습니다 :after_find 콜백을 사용하여 nil 값을 덮어 씁니다.

프로필 모델 :보기에서

def after_find 
    if self.image.nil? 
     self.image = "/assets/generic_profile_image.png" 
    end 
    end 

(HAML) :

.profile_pic 
    = image_tag @user.profile.image 

프로파일 모델은 사용자에 연결되어 모델은 has_one 연관을 통해 모델링한다. 지금 대신 동적으로 "/assets/generic_profile_image.png"에 이미지 속성을 돌려, 내 페이지에서 다음 생성 된 코드로 날 떠나 아무것도하지 않는 것 같다

<div class='profile_pic'> 
     <img alt="Assets" src="/assets/" /> 
    </div> 

이 문제를 해결하는 방법에 대한 어떤 제안 대단히 감사하겠습니다!

P. 프로파일 이미지가 너무 많은 곳에서 보여지기 때문에 뷰의 조건부는 문제가되지 않습니다!

답변

1

내 생각은 당신의 after_find 콜백 실제로라는지고 ins't됩니다 : 물론

당신은 이미 뷰 코드를 짐작했습니다. 다음과 같이 정의해야합니다.

class Profile < ActiveRecord::Base 
    after_find :update_image 

    def update_image 
    if self.image.nil? 
     self.image = "/assets/generic_profile_image.png" 
    end 
    end 
end 

이제 모든 것이 올바르게 작동합니다.

+0

완벽하게 작동했습니다! 위의 코드를 작성할 때 자고 있었어야합니다. –

3

모델에서 조건을 만들고 뷰에서 참조하기 만하면됩니다.

class User 
    delegate :image, :to => :profile, :prefix => true, :allow_nil => true 

    def picture_url 
    if profile_image.present? 
     profile_image 
    else 
     "/assets/generic_profile_image.png" 
    end 
    end 
end 

기본 그림을 변경하려는 경우 SQL 쿼리를 실행할 필요가 없으므로이 방법이 마음에 듭니다.

demeter의 법을 위반하지 않도록 위임자를 추가했습니다.

.profile_pic 
    = image_tag @user.picture_url  
+0

나는이 방법을 좋아하는데, 나는 그것을 확실히 시도 할 것이다! –

관련 문제