访问视图中的相关记录(显示页面)

时间:2013-08-09 07:12:20

标签: ruby-on-rails-3 associations

我有以下关联设置:

class Image < ActiveRecord::Base
  belongs_to :imageable, polymorphic: true

  attr_accessible :photo
  has_attached_file :photo, :styles => { :small_blog => "250x250#", :large_blog => "680x224#", :thumb => "95x95#" }
end

class Post < ActiveRecord::Base
  has_many :images, as: :imageable

  accepts_nested_attributes_for :images
  attr_accessible :comments, :title, :images_attributes
end

例如,要在我的索引页面中访问帖子的图像,我会将我的代码放在一个块中并使用each循环:

<% @posts.each do |p| %> 
  <% p.images.each do |i| %>
    <%= image_tag(i.photo.url(:large_blog), :class => 'image') %>
  <% end %>
<% end %>

所以当我在我的节目视图中访问该帖子时,我只访问一条记录,我认为我可以访问这样的图像:

<%= image_tag(@post.image.photo.url(:large_blog), :class => 'image') %>

但似乎我不能得到像以下那样的错误:未定义的方法'image'。

我没有想到这里真正基本的东西,并希望有人能指出我正确的方向。

2 个答案:

答案 0 :(得分:1)

您在has_many模型中与ImagePost的关系,因此您无法访问Post.image,因为您每个模型只有一组图像帖子。用简单的英语:

你来到这里:

使用Post方法迭代的@postseach)集合

<% @posts.each do |p| %>

现在p表示单个帖子,其中包含images

的集合
  <% p.images.each do |i| %>

再次,您迭代images并最终显示附加到image的每个Post

    <%= image_tag(i.photo.url(:large_blog), :class => 'image') %>
  <% end %>
<% end %>

因此,您可以看到每个Post可能包含多个图片,即使它只有一个图像,它仍然是一个数组,因此您只能通过@post.images.each甚至{{{{}}访问它1}}(或@post.images.first)如果你只想要第一个。

如果你真的想也能last,你也应该添加到Post模型:

@post.image

您还可以添加其他条件(如上面的代码所示)以仅选择最新的照片等。您可以阅读更多相关信息here

答案 1 :(得分:0)

好的,以防万一其他人处于类似的情况,这就是我为了让它发挥作用所做的,除非有人有更好的选择

<% for image in @post.images %>
  <a title=""><%= image_tag(image.photo.url(:large_blog), :class => 'image') %></a>
<% end %>