2013-04-14 5 views
3

는이 같은 제품 모델이Carrierwave 및 has_many

class ProductImageUploader < CarrierWave::Uploader::Base 
... 
def default_url 
    asset_path([version_name, "default.jpg"].compact.join('_')) 
end 
end 

을하지만 난에 대한 이미지를 업로드하지 않는 경우 제품으로, 나는 image_thumb과 image 메소드에서 'nil'을 얻을 것이다. 업로드 된 이미지가 하나도없고 Product와 ProductImage 모델 간의 관계가 일대 다이면 default_url을 얻는 방법은 무엇입니까?

+0

물론 '수동으로'images.first '를 nil로 확인한 다음 true이면 기본 이미지를 설정할 수 있습니다. 그러나 그것은 우아하지 않은 변종입니다. –

답변

4

는 업 로더가 당신을 도울 수, 당신 때문에 손으로해야 해. 이미 발표자를 사용하고 있으므로 매우 쉽습니다.

def image_thumb 
    if images.any? 
    images.first.image.thumb.url 
    else 
    asset_path("default.jpg") 
    end 
end 

def image 
    if images.any? 
    images.first.image.url 
    else 
    asset_path("thumb_default.jpg") 
    end 
end 

비슷한 코드가 belongs_to 관계에서 작동합니다.

+0

이 었습니다. 감사합니다 –

+0

더 우아한 해결책이 있습니다. Product 클래스에서 thumb 헬퍼를 다음과 같이 변경합니다 :'def image() images.first.image || ProductImageUploader.new end' 다음에'product.image.url'을 호출하면 이미지가 null 인 경우 정의한'default_url'을 렌더링합니다. – nateware

0

default_url에 대한 값은 얼마입니까?

경로가 올바르게 평가되지 않았을 수 있습니다.

(그것이 있어야 무엇에 아래의 경로를 수정 물론) 같은 것을보십시오 : 당신은 업 로더에 대한 액세스 권한이없는 경우

class ProductImageUploader < CarrierWave::Uploader::Base 
    ... 

    def default_url 
     "/assets/" + [version_name, "default.jpg"].compact.join('_') 
    end 
end 
+0

default_url 메소드에 문제가 없습니다. 'images.first.image'의 문제 image.first가 nil –

+0

을 반환하기 때문에 images.first가 nil을 반환하면 객체가 모두 존재하지 않는다는 의미입니다. 기본값으로 작업 할 객체가 필요합니다. ProductImage 인스턴스가 존재하지 않는 것처럼 보입니다. 이미지 속성이 – Dorian