avosalmonのブログ

プログラミングやWebデザイン、DTMについて調べたことをメモってます。プログラマー兼ベーシストです。

【Rails4】active_admin+PaperClipでhas_manyなform

itemモデル has_many :item_image
item_imageモデル belongs_to :item

【Rails】PaperClip + active_adminで画像をアップロード - avosalmonのブログ
上の記事で、itemモデルが複数のitem_imageを持つ(has_many)場合、active_adminのitem登録画面で複数のitem_imageを登録できるようにする。(意味伝わりますかね?)

Model
app/models/item.rb

has_many :item_images, :dependent => :destroy
accepts_nested_attributes_for :item_images, :allow_destroy => true
app/models/item_image.rb

class ItemImage < ActiveRecord::Base
  belongs_to :item
  validates :image, presence: true
  has_attached_file :image,
                    :styles      => { :medium => "500x600<", :thumb => "75x90>" },
                    # 1つのItemが複数のItemImageをもつ場合、下記の指定が必要かも
                    :path => ":rails_root/public/system/:attachment/:id/:style/:filename",
                    :url => "/system/:attachment/:id/:style/:filename"

  validates_attachment :image, content_type: { content_type: ["image/jpg", "image/jpeg", "image/png"] }
end
active_admin
app/admin/item.rb

permit_params :name, :price, :item_category_id, :description, :material, :item_images_attributes => [:id, :image, :_destroy]

form do |f|
  f.inputs "アイテム" do
    f.input :name
    f.input :price
    f.input :item_category
    f.input :description
    f.input :material

    f.inputs do
      f.has_many :item_images, heading: "アイテム画像", allow_destroy: true, new_record: true do |p|
        p.input :image, :as => :file, :hint => p.object.new_record? ? "" : p.template.image_tag(p.object.image.url(:thumb))
      end
    end
  end
  f.actions
end


参考記事
Rails4 - Rail 4.1.rc1でActiveAdminとhas_manyなnested form - Qiita
ruby on rails - Activeadmin and Paperclip : ArgumentError - Stack Overflow