Ruby on Rails - 种子未定义的方法错误

时间:2017-02-16 15:41:37

标签: ruby ruby-on-rails-4 seed seeding

在我的申请中,我有Post& Slide模型。 post has many slides& slide belongs_to post

我的幻灯片中的所有每个都有一张图片(我使用carrierwave gem进行上传),但目前我的一些帖子没有&#39 ;有图像。

我试图抓住每个帖子的第一张幻灯片,并在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

为什么我NoMethodError获得image,我该如何解决?

2 个答案:

答案 0 :(得分:0)

听起来你post没有任何幻灯片,所以

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

或者您可以更进一步,只选择首先至少有一张幻灯片的帖子:

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

答案 1 :(得分:0)

您需要在代码中添加一个条件。

import matplotlib.pyplot as plt 

##here are datas##

sample  =[1,31,52,72,9,53,6,8,54,32,9,7,6,35,7,43,23,31,4,1,0,9,8,7,9,11,12,15,16,123,23,25,26,26,35,44,12,54]

##Here is the Histogram plot##
bins=[0,10 ,20,30,40,50,60]
plt.hist(sample, bins, histtype='bar', rwidth='0.8', color='m',label="sample hist")

plt.xlabel('x values')
plt.ylabel('y values')
plt.title('title line 1\ntitle line 2')
plt.legend()
plt.show()

我希望它对你有用。