2017-02-16 21 views
0

私のアプリケーションで私はPost &モデルを持っています。 post has many slides & slide belongs_to post。私のスライドのRuby on Rails - シード未定義メソッドエラー

すべては、一つの画像があり、各(Iがアップロードするcarrierwave gemを使用しています)が、現在の私の記事のいくつかはイメージを持っていません。

私はを取得しようとしています。各投稿の最初のスライドseedの助けを借りて投稿に画像をアップロードしてください。

これは私がseeds.rbにしようとしたものです:

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を得るのですかどうすれば修正できますか?あなたが任意のスライドを持っていないpostを持っているようですね

+0

コードを表示する必要がありますが、ポストに画像がないので、まず関連するモデルインスタンスを作成する必要があります。 – lcguida

+0

'posts = Post.all.where(画像:nil)'を 'posts = post(画像:なし)'に変更します。 –

答えて

0

、そう

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

nilを返しています。

単にslideが存在することを確認してください。

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 

あなたが正しくbelongs_tohas_many関係を設定している場合は、あなたがこのビット簡素化することができます:

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 

それとも、さらに行くと、それだけで記事を選択することができますが最初の場所に少なくとも1つのスライドがあります。

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 "スライド" * FROM "スライド" WHERE "slides"。 "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 updateが実行されました。しかし、 'posts.each do'の外側にある場合、' slide'をどのように選択すればいいですか –

+0

ログに 'ROLLBACK'が表示されているのは、' update'が失敗したためです。おそらくモデルが保存されないようにする検証ロジックがあります。いくつかのロギングまたはブレークポイントを追加して、保存しない理由を見つけてみてください。post.update(ここにあなたの変更があります..)がない限り、 'binding.pryのポイントを追加する方法はここにあります。' – nburkley

0

コードに条件を1つだけ入れる必要があります。

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 "スライド" * FROM "スライド" WHERE "slides"。 "post_id" = 7257 ORDER BY created_at DESC LIMIT 1 01(0.1ms)BEGIN 01( 0.1ms)ROLLBACK –

+0

あなたは完全なログを追加できますか? –

+0

上記のように、そのスライドの負荷は0.3msです。 "スライド" FROM "スライド" WHERE "スライド" "post_id" = 7257 ORDER BY created_at DESC LIMIT 1 01(0.1ms)BEGIN 01(0.1ms )ROLLBACK **と変更されたのは 'post_id'です –

関連する問題