Ruby on Railsによる野球選手マスタメンテナンスアプリケーションの作成 その1
scaffoldによるアプリケーションの生成
まず、データベース上に、下記のようなテーブルを用意します。
class CreateMstBaseballPlayers < ActiveRecord::Migration def self.up create_table :mst_baseball_players do |t| t.column :player_name , :string , :limit=>125 t.column :uniform_number , :integer, :limit=>3 t.column :profile , :text t.column :record , :text t.column :comment , :text t.column :pitcher_flag , :boolean t.column :win_count , :integer, :limit=>3 t.column :defeat_count , :integer, :limit=>3 t.column :save_count , :integer, :limit=>3 t.column :earned_run_average , :float t.column :games_started , :integer, :limit=>3 t.column :batting_average , :float t.column :home_run , :integer, :limit=>3 t.column :ribby , :integer, :limit=>3 t.column :base_steal , :integer, :limit=>3 t.column :main_image_path , :text t.column :detail_image_path , :text t.column :expanded_image_path, :text end end def self.down drop_table :mst_baseball_players end end
次に、scaffoldにて野球選手マスタメンテナンスを作成します。
ruby script/generate scaffold MstBaseballPlayer --skip
「http://localhost:3000/mst_baseball_players/list」にアクセスすることで、図3のような画面を閲覧できます。
RMagickのインストール
本稿では、Ruby on RailsからImageMagickという画像操作用のソフトウェアスイートを使用して、アップロードされた画像のサイズを変更しています。ImageMagickをRuby on Railsで使用するためにはRMagickというモジュールが必要になります。Ruby ForgeのRMagickダウンロードページから入手することができます。
本稿では、「RMagick-2.5.0-ImageMagick-6.4.1-5-Q8.zip」をダウンロードし、インストールしていきます。こちらのページの「rmagick-win32」の欄にあります。
ダウンロード後、伸張したフォルダの中に「ImageMagick-6.4.1-5-Q8-windows-dll.exe」が入っています。これを起動することでImageMagickをWindows環境へインストールすることができます。ImageMagickのインストール後、可能であれば再起動を行ってください。
次に、コマンドプロンプト開いて伸張したフォルダに移動し、下記のコマンドを入力して、RMagickをインストールします。
gem install rmagick-2.5.0-x86-mswin32.gem
これで、Ruby on RailsからRMagickを利用できるようになります。
画像アップロード用のモデル修正
次に、画像をアップロードできるようにscaffoldで生成したコードを修正します。まず、モデルを修正します。
require 'RMagick' class MstBaseballPlayer < ActiveRecord::Base DIRECTORY = 'public/mst_baseball_images' MAIN_SIZE = [160, 120] DETAIL_SIZE = [320, 240] EXPANDED_SIZE = [640, 480] after_save :process after_destroy :cleanup def file_data=(file_data) unless file_data.class == String @file_data = file_data write_attribute 'extension', file_data.original_filename.split('.').last.downcase end end def main_url main_path.sub(/^public/, '') end def detail_url detail_path.sub(/^public/, '') end def expanded_url expanded_path.sub(/^public/, '') end def main_path File.join(DIRECTORY, "#{self.id}-main.#{extension}") end def detail_path File.join(DIRECTORY, "#{self.id}-detail.#{extension}") end def expanded_path File.join(DIRECTORY, "#{self.id}-expanded.#{extension}") end ########## private ########## def process if @file_data create_directory cleanup save_detail_size save_main_size save_expanded_size save_detail_resize @file_data = nil end end def save_detail_size File.open(detail_path, 'wb') do |file| file.puts @file_data.read end end def save_main_size img = Magick::Image.read(detail_path).first thumbnail = img.thumbnail(*MAIN_SIZE) thumbnail.write main_path end def save_expanded_size img = Magick::Image.read(detail_path).first thumbnail = img.thumbnail(*EXPANDED_SIZE) thumbnail.write expanded_path end def save_detail_resize img = Magick::Image.read(expanded_path).first thumbnail = img.thumbnail(*DETAIL_SIZE) thumbnail.write detail_path end def create_directory FileUtils.mkdir_p DIRECTORY end def cleanup Dir[File.join(DIRECTORY, "#{self.id}-*")].each do |filename| File.unlink(filename) rescue nil end end end
require 'RMagick'
によりRMagickをロードします。これは、アップロードされた画像を「MAIN_SIZE、DETAIL_SIZE、EXPANDED_SIZE」のサイズに加工して保存するために必要です。
mst_baseball_player.rbに関する説明
DIRECTORY = 'public/mst_baseball_images'
で画像の保存場所を定義しています。一般的にRailsでは、「public」フォルダの配下に画像などのコンテンツを保存します。main_url
、detail_url
、expanded_url
で先頭の「public」を除いています。これは、保存された画像にURLでアクセスする場合、「http://localhost:3000/mst_baseball_images/1-main.jpg」のように「public」を除いたURLにする必要があるためです。
モデルのafter_save
にprocess
を定義することで、データベース上のレコードを更新した後に、process
メソッドで後処理を行うことができます。process
メソッドでは、下記のような処理を行っています。
メソッド名 | 処理内容 |
create_directory | 存在しなければディレクトリを作成します。 |
cleanup | ファイルが存在していれば消去します。 |
save_detail_size | アップロードされた画像を保存します。 |
save_main_size | save_detail_sizeで保存した画像をMAIN_SIZEにして保存します。 |
save_expanded_size | save_detail_sizeで保存した画像をEXPANDED_SIZEにして保存します。 |
save_detail_resize | save_detail_sizeで保存した画像をDETAIL_SIZEにして保存します。 |