2017-02-16 1 views
0

내 응용 프로그램 있음 Post &모델입니다. post has many slides & slide belongs_to post. 내 슬라이드Ruby on Rails - 시드 정의되지 않은 메서드 오류

모든 한 이미지가 각 (I 업로드에 대한 carrierwave gem을 사용하고 있습니다)하지만, 현재 나의 글의 일부는 이미지가 없습니다.

첫 번째 슬라이드 각 게시물을 업로드하고 seed의 도움으로 게시물에 이미지를 업로드하려고합니다. 나는이 프로그램을 실행할 때, 내가 할

posts = Post.all.where(image: nil) 

posts.each do |post| 
    slide = Slide.where(post_id: post).order('created_at DESC').first 
    post.update(remote_image_url: slide.image_url(:thumb_huge)) 
end 

posts = Post.all.where(image: nil) 

posts.each do |post| 
    slide = Slide.where(post_id: post).order('created_at DESC').first 
    post.update(remote_image_url: "http://mywebsite.com/uploads/slide/image/#{slide}/#{slide.image}") 
end 

을 : NoMethodError: undefined method image' for nil:NilClass

가 왜 image에 대한 NoMethodError을받을 수 있나요

내가 seeds.rb에서 시도한 것입니다 어떻게 해결할 수 있습니까?

+0

코드를 표시해야하지만 게시물에 이미지가 없으므로 추측합니다. 먼저 연결된 모델 인스턴스를 만들어야합니다. – lcguida

+0

'posts = Post.all.where (이미지 : 없음)'을'posts = Post.where (이미지 : 없음)'로 변경합니다. –

답변

0

당신이 어떤 슬라이드가없는 post을 가지고있는 것처럼 너무 소리

Slide.where(post_id: post).order('created_at DESC').first

nil을 반환합니다.

단순히 slide이 존재하는지 확인하여 해결해야합니다. 당신이 올바르게 belongs_tohas_many 관계 설정이있는 경우

posts.each do |post| 
    slide = Slide.where(post_id: post).order('created_at DESC').first 

    if slide.present? 
    post.update(remote_image_url: "http://mywebsite.com/uploads/slide/image/#{slide}/#{slide.image}") 
    end 
end 

그러나이 조금 단순화 할 수 있습니다 :

posts.each do |post| 
    if post.slides.any? 
    slide = post.slides.first 
    post.update(remote_image_url: "http://mywebsite.com/uploads/slide/image/#{slide}/#{slide.image}") 
    end 
end 

을 또는 더 심지어 이동 만 게시물을 선택 수있는 첫 번째 장소에 슬라이드가 하나 이상 있어야합니다.

posts = Post.joins(:slides).uniq 

posts.each do |post| 
    slide = post.slides.first 
    post.update(remote_image_url: "http://mywebsite.com/uploads/slide/image/#{slide}/#{slide.image}") 
end 
+0

@nburkley. 솔루션 중 하나를 실행할 때'update'가 아닌'select' 만 실행합니다. ** 이것은 내 터미널에 있습니다 : ** 슬라이드로드 (0.3ms) SELECT "슬라이드". * "슬라이드"에서 "슬라이드". "post_id"= 7257 ORDER BY created_at DESC LIMIT 1 01 (0.1ms) BEGIN 01 (0.1ms) ROLLBACK' –

+0

내가'슬라이드 '를 선택했을 때'포스트 업데이트'가 아닌 '슬라이드로드'만 실행하는 것처럼 보입니다. 나는'posts = post.slides.first'를'posts.each do'에서 제거함으로써 테스트를 마쳤습니다. 그리고 post 업데이트가 실행되었습니다.그러나'posts.each do'의 바깥 쪽에서'slide'를 선택하는 방법은 무엇입니까 –

+0

로그에'ROLLBACK'이 보이면'update'가 실패했기 때문입니다. 아마도 모델이 저장되지 못하게하는 유효성 검사 로직이있을 것입니다. 저장하지 않을 이유를 찾으려면 로깅이나 중단 점을 추가하십시오. 여기에 post.update (여기에 변경 사항이 없습니다 ..)가 아닌 경우 binding.pry를 추가하는 방법이 있습니다. ' – nburkley

0

코드에 조건을 하나만 넣으면됩니다.

posts.each do |post| 
    if post.slides.count > 0 
    slide = Slide.where(post_id: post).order('created_at DESC').first 
    post.update(remote_image_url: slide.image_url(:thumb_huge)) 
    end 
end 

나는 그것이 당신을 위해 작동하기를 바랍니다.

+0

Thanks @Divyang. 솔루션을 실행할 때'update'가 아닌'select' 만 실행합니다. ** 이것은 내 터미널에 있습니다 : ** 슬라이드로드 (0.3ms) SELECT "슬라이드". * "슬라이드"에서 "슬라이드". "post_id"= 7257 ORDER BY created_at DESC LIMIT 1 01 (0.1ms) BEGIN 01 (0.1ms) ROLLBACK –

+0

전체 로그를 추가 할 수 있습니까? –

+0

언급 한 바와 같이, 단지 ** 슬라이드로드 (0.3ms) SELECT "슬라이드". * "슬라이드"에서 "슬라이드". "post_id"= 7257 ORDER BY created_at DESC LIMIT 1 01 (0.1ms) BEGIN 01 (0.1ms) ROLLBACK ** 그리고 유일한 변경 사항은'post_id'입니다 –

관련 문제