尝试渲染图像,但返回#<activerecord :: associations :: collectionproxy [] =“”>

时间:2015-09-01 11:20:33

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

我的导游可以有很多guide_pics。在我的节目指南视图中,我想展示照片。我试图使用

<%= image_tag @guide.guide_pics if @guide.guide_pics %>

页面呈现的是文本:

,而不是图像

所以看起来有些东西存在,我只需要拍照。

但是在调试器中这给出了

#<ActiveRecord::Associations::CollectionProxy []>

这是否意味着返回一个空对象?如果是这种情况,也许我把db播种错了:

g1.guide_pics.build(picture: File.open(File.join(Rails.root, '/public/2015-08-28 18.55.47.jpg')))

否则,也许我将关联设置错误。

我的guide_pic模型

class GuidePic < ActiveRecord::Base
  belongs_to :guide
  validates :guide_id, presence: true
  validates :picture, presence: true

  default_scope -> { order(created_at: :desc) }
end

我的指南模型

class Guide < ActiveRecord::Base
  belongs_to :user

  has_many :guide_pics, dependent: :destroy

  #mount_uploader :picture, PictureUploader
end

3 个答案:

答案 0 :(得分:3)

guide_pics是一个关联,将返回一个或多个guide_pics

所以你必须迭代所有guide_pics,如下所示:

<% @guide.guide_pics.each do |guide_pic| %>
  <%= image_tag guide_pic.picture.url %>
<% end %>

请注意我写guide_pic.picture.url:我假设您正在为附件使用gem,例如carrierwave或类似的东西,可以为您的图像构建一个网址 - 如果不是,您将自己添加。

但如果你只是想展示第一张照片,你可以做点像

<%= image_tag @guide.guide_pics.first.picture.url if @guide.guide_pics.count > 0 %>

答案 1 :(得分:1)

Rails做得正确,你是误会。

虽然模型有很多图片(has_many关系),但rails会自动生成一种访问这些图片的方法。

在这种情况下,Guide.guide_pics正在向DB发出查询,例如 SELECT * from guide_pics where guide_id=5 正如您所看到的 - 这是选择所有行,即与一个指南相关联的数据洞集。这就是ActiveRecord被称为ActiveRecord :: Collection。

首先,是的,你把DB播种错了!.build方法没有向数据库保存任何内容,您应该调用.create方法。

如果您的数据库中有任何对象,则有两(3)种渲染图像的方式。

<%= image_tag @guide.guide_pics.first.url if @guide.guide_pics.any? %> 这将收集Collection中的第一张照片,如果有的话。 这是错误代码。 另一个选择是说.take而不是.first。

更好的代码就像是

<%= image_tag @guide.preview_picture %>

要这样做,你需要一个模型函数

class Guide
  def preview_picture
    guide_pics.first.url || "/images/no-logo.jpg"
  end
end

这将自动拍摄第一张照片或返回默认字符串。

我建议你:看看Carrierwave,Dragonfyl或Paperclip。这是很棒的FileUploading Gems - 符合您的需求。

答案 2 :(得分:0)

查看image_tag的文档,它希望图像源不是collection_proxy您需要迭代列表并逐个显示图像

<% @guide.guide_pics.each do |pic|%>
  <%= image_tag pic %>
<% end %>

注意:pic可以是网址或图片名称,具体取决于您的图片保存技术。