我的导游可以有很多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
答案 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可以是网址或图片名称,具体取决于您的图片保存技术。