2009-09-10
FileColumn
画像ファイルなどのファイルの扱いが簡単にできるFileColumnを紹介します。
ベースとするプロジェクトを「i18nによる日本語化」で使用したproj001とします。
1.file_columnのインストール
| コマンド プロンプト |
D:\Rails_Projects\proj001>ruby script/plugin install http://filecolumn.googlecode.com/svn/tags/file_column ./CHANGELOG ./README ./Rakefile ./TODO ./init.rb ./lib/file_column.rb ./lib/file_column_helper.rb ./lib/file_compat.rb ./lib/magick_file_column.rb ./lib/rails_file_column.rb ./lib/test_case.rb ./lib/validations.rb ./test/abstract_unit.rb ./test/connection.rb ./test/file_column_helper_test.rb ./test/file_column_test.rb ./test/fixtures/entry.rb ./test/fixtures/invalid-image.jpg ./test/fixtures/kerb.jpg ./test/fixtures/mysql.sql ./test/fixtures/schema.rb ./test/fixtures/skanthak.png ./test/magick_test.rb ./test/magick_view_only_test.rb |
2.項目の追加
NetBeansで[生成]を選択します。
ジェネレータ(G):migration
引数(A):add_image_to_addresses image:string
3.マイグレーションファイルの確認
db/migrate/yyyymmddhhmmss_add_image_to_addresses.rbを確認してみましょう。
項目imageが追加されています。
| /db/migrate/yyyymmddhhmmss_add_image_to_addresses.rb |
class AddImageToAddresses < ActiveRecord::Migration def self.up add_column :addresses, :image, :string end def self.down remove_column :addresses, :image end end |
4.マイグレーションの実行
[データベースマイグレーション]より[現在のバージョンへ]を選択します。
5.モデルの修正
| /app/models/address.rb |
class Address < ActiveRecord::Base file_column :image validates_presence_of :namae validates_uniqueness_of :namae validates_length_of :namae, :maximum => 12 validates_presence_of :yubin validates_length_of :yubin, :within => 3..8 validates_presence_of :jusho validates_presence_of :denwa validates_format_of :denwa, :with => /\d{3}-\d{3}-\d{4}|\d{4}-\d{2}-\d{4}/ end |
6.ビューの修正
追加した項目imageをそれぞれのビュープログラムに埋め込みます。
| /app/views/index.html.erb |
<r/> <h1><%= t('label.Listing_addresses') %></h1> |
| /app/views/new.html.erb |
<br/> <h1><%= t('label.New_address') %></h1> |
| /app/views/edit.html.erb |
<br/> <h1><%= t('label.Editing_address', :html => {:multipart => true}) %></h1> |
| /app/views/show.html.erb |
<p>
<b><%= t('label.Namae') %>:</b>
<%=h @address.namae %>
</p>
|
これで実行をするとNameErrorが発生します。
これの対処法は、http://d.hatena.ne.jp/aki-s-119/20081201/1228168584に詳しいですが、
次の部分を書き換えることでエラーは回避できます。
| /vender/plugins/file_column/lib/file_column.rb |
require 'fileutils'
require 'tempfile'
require 'magick_file_column'
module FileColumn # :nodoc:
:
:
def file_column(attr, options={})
options = DEFAULT_OPTIONS.merge(options) if options
my_options = FileColumn::init_options(options,
self.name.to_s.underscore,
attr.to_s)
:
:
end
:
:
end
|
8.動作確認
実際にプログラムを実行してみます。
ファイル名が英字の場合はうまくアップロードされますが、漢字の場合うまくいきません。
(アップロードするファイル名が「顔写真-画像02.jpg」の場合)
(アップロードされたファイル名が「___-__02.jpg」となってしまう)
日本語のファイル名も使用できるようにするために、ふたたびfile_columnを修正します。
| /vender/plugins/file_column/lib/file_column.rb |
require 'fileutils'
require 'tempfile'
require 'magick_file_column'
module FileColumn # :nodoc:
:
:
def self.sanitize_filename(filename)
filename = File.basename(filename.gsub("\\", "/")) # work-around for IE
filename.gsub!(/[^\w\.\-\+_]/,"_")
filename = "_#{filename}" if filename =~ /^\.+$/
filename = "unnamed" if filename.size == 0
filename
end
end
|
10.動作確認
これで日本語のファイル名も扱うことができます。
(アップロードするファイル名が「顔写真-画像03.jpg」の場合)
(アップロードされたファイル名も「顔写真-画像03.jpg」となる)
11.画像の表示
さらに画像については表示するようにします。
| /app/views/show.html.erb |
<p>
<b><%= t('label.Namae') %>:</b>
<%=h @address.namae %>
</p>
|
(実際に画像を表示した場合)
12.画像の拡大縮小
表示される画像の大きさを制御しましょう。
| /app/views/show.html.erb |
<p>
<b><%= t('label.Namae') %>:</b>
<%=h @address.namae %>
</p>
|
なお、ここで:size=>"50x50"を:width=>"50"や:hight=>"50"と書くことができます。
これにより横幅を揃えたり、高さを揃えたりすることができます。
(縮小された画像を表示)
- 7 http://planetnetbeans.org/ja
- 5 http://lye.sns.avislan.avis.ad.jp/
- 4 http://www.nisa.or.jp/it-support/challenge.html
- 3 http://www.google.co.jp/hws/search?hl=ja&q=rails+text_field+判定&client=fenrir&channel=&adsafe=off&safe=off&lr=lang_ja
- 2 http://d.hatena.ne.jp/atkatanto/20090906/p1
- 2 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&hs=Y4J&q=File+Column&btnG=検索&lr=
- 2 http://www.google.co.jp/search?hl=ja&q=challenge+ruby+on+rails&btnG=検索&lr=
- 2 http://www.google.co.jp/search?hl=ja&q=ruby+on+rails+activescaffold&lr=lang_ja
- 1 http://d.hatena.ne.jp/diarylist?of=150&mode=rss&type=public
- 1 http://d.hatena.ne.jp/jk25k/20090907/1252338131







