2013-02-01 61 views
0

这应该有点简单,但似乎无法掌握关联。两个模型轨之间的关联3

我正在使用nested_form和paperclip。我有一个名为照片的模型来存储所有图像和后期模型。我正在尝试显示与相关帖子相关的照片,但在渲染视图时会显示“未定义的方法头像”。

class Post < ActiveRecord::Base 
has_many :photos, :dependent => :destroy 
accepts_nested_attributes_for :photos 
attr_accessible :title, :comments, :photo_id, :avatar, :photos_attributes 
end 

Class Photo < ActiveRecord::Base 
belongs_to :post 
attr_accessible :avatar, :post_id 
has_attached_file :avatar, :styles => { :medium => "300x300>", :thumb => "100x100>" } 
end 

控制器

def new 
@post = Post.new 
@post.photos.build 
end 

,所以我的印象是,当一个岗位被建成了信息和照片模式之间的关联是由?是对的吗?

所以,当我把这个在视图中我得到的未定义的方法,任何人都可以提醒我要去的地方错了,请

<% @posts.each do |f| %> 
<ul> 
<li><%= f.title %></li> 
<li><%= f.department.name %></li> 
<li><%= image_tag f.avatar.url(:thumb) %></li> 
<li><%= link_to "Delete Post", post_path(f.id), :confirm => "Are you sure?", :method => :delete %></li> 
</ul> 
<% end %> 

我已经试过

<%= image_tag f.photo.avatar.url(:thumb) %> 

但是,这并不工作要么

回答

2

可能是你正在创建照片错误。

在这里你可以看到的表单外观:Nested form using paperclip

而且还Posthas_many :photos,所以它必须是somth。像

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


<% f.photos.each do |photo| %> 
    <%= image_tag photo.avatar.url(:thumb) %> 
<% end %> 


... 
<% end %> 
+0

谢谢,我想这是建立照片,因为我改变了我的看法,照片到你的答案,f.photos.each。所以这是有效的,因为照片嵌套在帖子内?感谢虽然所有工作,现在可以上传多个图像,并显示他们的帖子相关 – Richlewis

+0

它的作品,因为你的文章有很多照片。这意味着'''f.photos'''会返回一个'''Photo'''对象的数组。所以循环他们会告诉你图像) – Bob

+0

优秀,感谢清除那 – Richlewis

0

我认为在你的控制器中,你应该首先定义你正在关联的post对象:

def new 
    @post = Post.find(params[:post_id] 
    @photo = @post.photos.build 

    .... 
    end 

同样在PhotosControllercreate动作。

1

当我使用嵌套属性时,我遵循三个步骤。首先,在父模型,你可以使用accepts_nested_attributes_for:

Class Post 
    has_many :photos, dependent: :destroy 
    accepts_nested_attributes_for :photos 
    attr_accessible :photos_attributes 
end 

其次,你可以将一个嵌套形式的照片,您可以设置照片的属性,对于特定职位:

<%= form_for(@post) do |f| %> 
    <%= f.fields_for :photos do |p| %> 
    ...rest of form here... 

三,您可以通过后期模型中的新动作创建照片:

Class UserController 
    def new 
    @user = User.new(photos: Photo.new) 
    end 
end 

最后一步很重要。如果您不这样做,则不会在用户表单中看到照片字段。如果您按照这些步骤操作,则应该可以在用户表单中设置来自照片和用户的所有属性。