画像ファイルをアップロードして自由に表示したい!その2

前回、convert_temp_fileメソッド*1をコントローラの中で定義したが、本来、この処理はモデルに任せた方がスッキリする。

アップロードするファイルをモデルで変換する例

Software.new(params[:software]) のパラメーターに[:temp_file]要素が含まれていると、Softwareモデルでは、temp_file=() メソッドが呼び出されるようだ。それを利用して、以下のように変換処理を定義した。

コントローラー
#------ app/controller/softwares_controller.rb ------
class SoftwaresController < ApplicationController
...(途中省略)...
  def new
    @software = Software.new
  end

  def create
    #convert_temp_file #<---削除した
    @software = Software.new(params[:software]) #<---モデルのtemp_file=()メソッド呼出しのタイミング
    if @software.save
      flash[:notice] = 'Software was successfully created.'
      redirect_to :action => 'list'
    else
      render :action => 'new'
    end
  end
...(途中省略)...
モデル
#------ app/models/software.rb ------
class Software < ActiveRecord::Base
  def temp_file=(file)
    self.file_name = file.original_filename
    self.file_type = file.content_type
    self.file_data = file.read
  end
end


これで、変換処理を気にせずに処理できる。とてもスッキリした!

*1:パラメータとして受け取ったTempfileオブジェクトをデータベースの形式にあわせて変換する。