SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

RailsとAIRで作成する画像のRevolver表示

RailsとAIRで作成する画像のRevolver表示(前篇)

Rails ActionWebServiceとAIRの連携による画像のRevolver表示

  • X ポスト
  • このエントリーをはてなブックマークに追加

ダウンロード サンプルソース (6.7 KB)

Ruby on Railsによる野球選手マスタメンテナンスアプリケーションの作成 その1

scaffoldによるアプリケーションの生成

 まず、データベース上に、下記のようなテーブルを用意します。

create_mst_baseball_players.rb
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にて野球選手マスタメンテナンスを作成します。

コマンドラインからの scaffold の実行
ruby script/generate scaffold MstBaseballPlayer --skip

 「http://localhost:3000/mst_baseball_players/list」にアクセスすることで、図3のような画面を閲覧できます。

図03-野球選手マスタメンテナンス(完成イメージ)
図03-野球選手マスタメンテナンス(完成イメージ)

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をインストールします。

RMagickをインストール
gem install rmagick-2.5.0-x86-mswin32.gem

 これで、Ruby on RailsからRMagickを利用できるようになります。

画像アップロード用のモデル修正

 次に、画像をアップロードできるようにscaffoldで生成したコードを修正します。まず、モデルを修正します。

mst_baseball_player.rb
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_urldetail_urlexpanded_urlで先頭の「public」を除いています。これは、保存された画像にURLでアクセスする場合、「http://localhost:3000/mst_baseball_images/1-main.jpg」のように「public」を除いたURLにする必要があるためです。

 モデルのafter_saveprocessを定義することで、データベース上のレコードを更新した後に、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にして保存します。

次のページ
Ruby on Railsによる野球選手マスタメンテナンスアプリケーションの作成 その2

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
RailsとAIRで作成する画像のRevolver表示連載記事一覧
この記事の著者

ryujinseiichi(リュウジンセイイチ)

http://ryujinseiichi.sblo.jp/ RubyやAIRなどの新規技術に興味があり、研究を行っています。 最近、seasar2やBPMの研究も始めました。  

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/2658 2009/10/20 17:07

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング