使用cocoon gem添加多个图像

时间:2015-12-17 23:27:59

标签: ruby-on-rails nested-forms cocoon-gem

首先,我不得不说我是铁杆新手,对新手问题感到抱歉。 我有一个" Post"有很多"图片"

的模特
class Post < ActiveRecord::Base

  has_many :pictures, :dependent => :destroy

  accepts_nested_attributes_for :pictures, :allow_destroy => true, :reject_if => lambda { |t| t['pictures'].nil? }


  belongs_to :user 

  monetize :price

  validates :title, :brand, :model, :price, :year, presence: true

end

和我的图片模型:

class Picture < ActiveRecord::Base
  belongs_to :post

  has_attached_file :image,
    :path => ":rails_root/public/images/:id/:filename",
    :url  => "/images/:id/:filename",
    styles: { medium: "600x600>"}


  validates_attachment_content_type :image, content_type: /\Aimage\/.*\Z/
  validates :image, presence: true

end

我的创作是:

def create
  @post = current_user.post.build(post_params)

  respond_to do |format|
    if @post.save
      if params[:images]

        params[:images].each { |image|
        @post.pictures.create(image: image)
        }
      end
      format.html { redirect_to @post, notice: 'Post was successfully created.' }
      format.json { render :show, status: :created, location: @post }
   else
      format.html { render :new }
      format.json { render json: @post.errors, status: :unprocessable_entity }
    end
  end
end 

我的强大参数是:

  def post_params
  params.require(:post).permit(:title, :decription, :brand, :model, :price,  pictures_attributes: [ :image, :_destroy])
end

我的表格:

 = simple_form_for @post, html: { multipart: true } do |f|


.form-group
  = f.input :title, input_html: { class: 'form-control'}

.form-group
  = f.input :brand, input_html: { class: 'form-control'}

.form-group
  = f.input :model, input_html: { class: 'form-control'}

.form-group
  = f.input :description, input_html: { class: 'form-control'}

.form-group
  = f.input :year,  input_html: { class: 'form-control'} 

.form-group
  = f.input :price,  input_html: { class: 'form-control'}



.form-group
  = f.simple_fields_for :pictures do |pic|
    = render 'picture_fields', f: pic

.links
  = link_to_add_association 'add pictures', f, :pictures, class: "btn btn-default"



= f.button :submit, class: "btn btn-primary"

.form-inline.clearfix
.nested-fields
    = f.file_field :picture
    = link_to_remove_association "delete", f

当我加热提交按钮时,帖子已保存,但无法迭代在节目中抛出帖子图片。 我的代码中有错误吗?有没有解决方案知道图片是否已保存?当我使用ruby控制台@post = Post.last和@ post.pictures给我这个:

图片加载(2.0ms)SELECT&#34;图片&#34;。* FROM&#34;图片&#34;在哪里&#34;图片&#34;。&#34; post_id&#34; =? [[&#34; post_id&#34;,34]] =&GT; #

1 个答案:

答案 0 :(得分:0)

这里至少有三件事:

首先,你不应该这样做(除非你自然还有其他方法使用同一个控制器)。 params[:images]始终为零:

if params[:images]
  params[:images].each { |image|
    @post.pictures.create(image: image)
  }
end

第二件事,似乎你的模型有一个属性image但是在你的表单中你有:

= f.file_field :picture

老实说,我希望这会引发异常,这可能是导致问题的原因。 (如果是这种情况 - 你应该总是发布与你的问题一起发布的任何例外情况。)

第三件事:它确实不是您要解决的问题,但很可能是您在解决此问题后发布的下一个问题:您在id中遗失了pictures_attributes在你强大的参数中 - 这将导致你复制每个表单提交上的所有现有图像+将无法删除图片。

编辑:

其他一些潜在问题。你应该总是在一些包装器中包含cocoon关联 - button_to_add_association后面的javascript期望某些DOM结构,这可能会被覆盖,但只是更容易使用默认值。

 #pictures
  .form-group
    = f.simple_fields_for :pictures do |pic|
      = render 'picture_fields', f: pic

  .links
    = link_to_add_association 'add pictures', f, :pictures, class: "btn btn-default"

另一个潜在的问题是你的偏见。 link_to_remove_association查找具有类nested-fields的最近父级并删除它(除非它是现有记录,在这种情况下它会添加一些额外的东西并隐藏它,不相关)。问题是如果你添加5张图片然后删除所有图片 - 你剩下5 .form-inline.clearfix件东西。我没有看到你的CSS,但这可能会使你的观点不一致/破碎。