諸行無常

IT色々お勉強中のブログ

rails ファイルアップロードなんどやっても忘れるのでメモ

ジェネレータでup用クラス作成

rails g uploader Image

つけた名前のあとにUploaderて名前がついたファイルが出来るっぽい

モデルとアップデートファイルを結びつける

  mount_uploader :about_image1, ImageUploder
  mount_uploader :about_image2,ImageUploder

S3に入れる場合 initializersにcarrierwave.rbとか作って設定入れる

Uploaderファイルを変更

  include CarrierWave::RMagick

  #S3に上げるのでfogを使う
  storage :fog
  #S3保存するディレクトリ場所
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end
  #キャッシュファイルの置き場所をルートから変えたい時設定
  def cache_dir
    "uploads_tmp/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end
  #変換したファイルのファイル規則
  def filename
    "#{secure_token}.#{file.extension}" if original_filename.present?
  end

  protected
  def secure_token
    var = :"@#{mounted_as}_secure_token"
    model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.uuid)
  end

上でファイルと結びつけたカラムをマイグレーションで作成、複数の場合はファイル保存用テーブル作成

class NoticeFile < ActiveRecord::Base
  belongs_to :hogeration

  acts_as_paranoid

  mount_uploader :file_path, NoticeUploader
end

viewを準備 hiddenフィールドをつけるとバリでショーンエラーになっても値が消えない。でもモデルに定義されてないとダメっぽ‥

  .row
    .col-xs-12.col-sm-4
      = f.label "添付ファイル"
    .col-xs-12.col-sm-8
      - (1..3).each do |key|
        = f.file_field "about_image#{key}".to_sym, class: 'file-inline'
        = f.hidden_field :"about_image#{key}_cache"

後は適当にコントローラで保存すればおk ←書くのがメンドクサクなった