【问题标题】:Association between two models rails 3两个模型之间的关联 rails 3
【发布时间】:2013-02-01 17:11:32
【问题描述】:

这应该有点简单,但似乎无法掌握关联。

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

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) %>

但这也不起作用

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 model associations


    【解决方案1】:

    可能是您创建的照片有误。

    您可以在此处查看表单的外观:Nested form using paperclip

    还有Posthas_many :photos,所以一定是这样。喜欢

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

    【讨论】:

    • 谢谢你,我猜它正在构建照片,因为我将照片的视图更改为你的答案 f.photos.each。所以这是有效的,因为照片嵌套在帖子中?感谢所有工作,现在可以上传多张图片并显示与他们的帖子相关的内容
    • 之所以有效,是因为您的帖子有很多照片。这意味着f.photos 返回一个由Photo 对象组成的数组。所以循环浏览它们会显示图像)
    【解决方案2】:

    当我使用嵌套属性时,我遵循三个步骤。首先,在父模型中可以使用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...
    

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      PhotosControllercreate 操作也是如此。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多