以嵌套形式使用回形针:如果不正确则拒绝

时间:2011-11-24 11:23:08

标签: ruby-on-rails paperclip nested-attributes

更新

如果我从此行中删除reject_if:

accepts_nested_attributes_for :image_blogs, :reject_if => lambda { |t| t['image_blog'].nil? }

它有效,如何修改它以按预期工作并在nil时阻止图像创建?


我使用以下教程创建带图像的帖子: http://sleekd.com/general/adding-multiple-images-to-a-rails-model-with-paperclip/ 目标是拥有一个包含0-n图像博客的帖子元素。 images blog是一个包含回形针的模型。我试图在post和post的同时创建image_blog元素。为此,我使用嵌套表格。

class PostsController < ApplicationController

def new
    @post = Post.new
    3.times{ @post.image_blogs.build}
    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @post }
    end
  end
end

-

class ImageBlog < ActiveRecord::Base
  belongs_to :post
  attr_accessible  :image
  has_attached_file :image , :styles => { :small => "150x150>", :large => "320x240>" }
end

-

class Post < ActiveRecord::Base
  has_many :image_blogs, :dependent => :destroy
  validates :title, :content, :presence => true
  validates :title, :uniqueness => true
  acts_as_taggable
  has_attached_file :image
  accepts_nested_attributes_for :image_blogs, :reject_if => lambda { |t| t['image_blog'].nil? }
end

-

    <%= form_for(@post,:html => { :multipart => true }) do |f| %>
      <div class="field">
        <%= f.label :title %><br />
        <%= f.text_field :title %>
      </div>
      <div class="field">
        <%= f.label :content %><br />
        <%= f.text_area :content, :class => "mceEditor" %>
      </div>
      <%= f.fields_for :image_blogs, do |ib|%>
      <p>
        <%= ib.label "Image du post"%>
        <%= ib.file_field :image %>
        <%#= ib.check_box :_destroy%>
        <%#= ib.label :_destroy,"Effacer l'image" %>
      </p>
      <% end %>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

我使用不同的有关嵌套回形针的教程检查了一切是否正确,但它仍然无法正常工作。邮件已创建,但不会复制图像,也不会创建图像博客元素。

为什么没有错误?为什么不起作用?

1 个答案:

答案 0 :(得分:3)

我相信你必须对lambda内的accepts_nested_attributes_for稍作修改,你正在评估的对象是image(ImageBlog的属性)而不是image_blog,这样:

accepts_nested_attributes_for :image_blogs, :reject_if => lambda { |t| t['image'].nil? }