5

我正在用Paperclip 2.3.8运行Rails 3.0.3。我有两个模型,称它们为“Post”和“Image”。图像是一个包含Paperclip图像文件的对象,用于动态添加图像到Posts。图片属于帖子,帖子有很多图片。销毁方法没有开火以销毁复杂形式的嵌套资源

邮政型号:

class Post < ActiveRecord::Base 
has_many :images 
accepts_nested_attributes_for :images, :reject_if => lambda { |a| a[:image].blank? }, :allow_destroy => true 
end 

图片型号:

class Image < ActiveRecord::Base 
belongs_to :post 
has_attached_file :image, 
     :styles => { 
     :thumb=> "100x100#", 
     :small => "300x300>" } 
end 

我在我想动态地添加和移除的图像的形式。如果图像是上传的新图像,我想显示一个file_field;否则,如果图像已经存在,我想显示图像和删除链接。我跟随瑞恩贝茨的嵌套表格Railscasts。动态添加图像正在工作,但对_destory的调用不会触发。该帖子包含“_destroy”=>“1”,但在HTTP Post事件之后,ID为7的图像仍然存在。下面是从HTTP后的摘录:

"images_attributes"=>{ 
    "0"=>{"id"=>"7", "_destroy"=>"1"}, 
    "1"=>{"id"=>"8", "_destroy"=>"false"}, 
    "2"=>{"id"=>"9", "_destroy"=>"false"}, 
    "3"=>{"id"=>"10", "_destroy"=>"false"}} 

这里是什么形式的样子:

<%= form_for @post, :html => { :multipart => true } do |f| %> 
<%= f.label :images, 'Images' %><br /> 
<div class="field"> 
    <%= f.fields_for :images do |s| %> 
    <%= render 'image_fields', :f => s %> 
    <% end%> 
</div> 
<div class="field"> 
    <%= link_to_add_fields "Add Image", f, :images %> 
</div> 
<div class="actions"> 
    <%= f.submit %> 
</div> 
<% end %> 

_image_fields:

<div class="fields"> 
<% if !f.object.new_record? %> 
    <%= image_tag f.object.image.url %> 
<% else %> 
    &nbsp; <%= f.file_field :image%> 
<% end %> 
<%= link_to_remove_fields "remove", f %> 
</div> 

JavaScript函数:

function remove_fields(link){ 
$(link).previous("input[type=hidden]").value = "1"; 
$(link).up(".fields").hide(); 
} 

function add_fields(link, association, content) { 
var new_id = new Date().getTime(); 
var regexp = new RegExp("new_" + association, "g") 
$(link).up().insert({ 
    before: content.replace(regexp, new_id) 
}); 
} 

助手功能:

def link_to_remove_fields(name, f) 
    f.hidden_field(:_destroy) + 
    link_to_function(name, "remove_fields(this)") 
end 

def link_to_add_fields(name, f, association) 
new_object = f.object.class.reflect_on_association(association).klass.new 
fields = f.fields_for(association, new_object, :child_index => "new_#{association}") do |builder| 
    render(association.to_s.singularize + "_fields", :f => builder) 
end 
link_to_function(name, "add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")") 
end 

正如我上面提到的,我可以添加图像。单击“添加图像”链接将一个文件字段添加到表单中,我可以成功添加多个图像。点击图片中的“删除”链接会从视图中删除链接和图片 - 但正如我所说的,它不会在发布后事件中删除。

谢谢你的高级;我感谢任何花时间帮助我找到解决方案的人。

编辑:

--Solution--

在岗控制器加入 “.includes(:图片)” 在更新方法查找:

def update 
@post = Post.includes(:images).find(params[:id]) 

respond_to do |format| 
    if @post.update_attributes(params[:post]) 
    format.html { redirect_to(@post, :notice => 'Post was successfully updated.') } 
    format.xml { head :ok } 
    else 
    format.html { render :action => "edit" } 
    format.xml { render :xml => @post.errors, :status => :unprocessable_entity } 
    end 
end 
end 

回答

9

我已经有一个非常类似的问题。我可以通过删除模型中的:reject_if子句来解决它。

accepts_nested_attributes_for :images, :allow_destroy => true 

一旦我删除它,我可以删除我的领域没有问题。这个明显的缺点是用户现在可以添加一个空白/无效的图像,模型不会拒绝它。

编辑:

看起来这实际上是使用Rails 3.0.4在问候的accepts_nested_attributes_for如何处理错误:allow_destroy和:reject_if。请参阅此处的答案以获得另一种解决方法:Paperclip problem for accepts_nested_attributes_for and reject_if

+0

尽管如果我删除了reject_if,这不是我的选择。我能够通过其他提供的链接找到答案。谢谢。 (编辑于上) – dmlogs 2011-02-24 18:22:34