RailsからMySQLのテーブルを作成する時にLONGBLOBなカラムを作成する方法

RailsからMySQLのテーブルを作成するには

Railsのマイグレート機能には、カラム属性としてbinaryがあるのですが、これを指定してもMySQL上ではBLOBというカラム属性になります。

構文としては
[ruby]create_table :user_photos do |t|
  t.string :name
  t.binary :photo_image
end[/ruby]
もっと大容量のLONGBLOBが欲しい!

という時にはbinaryの所にオプションで:limit => 16.megabyte を指定します。
[ruby]create_table :user_photos do |t|
  t.string :name
  t.binary :photo_image, :limit => 16.megabyte
end[/ruby]
こんな感じですね。

passengerをインストール

Ruby on Railsの本番実行環境として定着したpassengerです。

では、インストールをしてみます。

まず、passengerをインストールするために必要なモジュール

Ruby

基本中の基本

rubygems

gemでインストールするので、こちらも基本

あとは、以下のライブラリ群が必要になります。

  • GNU C++ compiler
  • Curl development headers with SSL support
  • OpenSSL development headers
  • Zlib development headers
  • Ruby development headers
  • OpenSSL support for Ruby
  • RubyGems
  • Rake
  • rack
  • Apache 2
  • Apache 2 development headers
  • Apache Portable Runtime (APR) development headers
  • Apache Portable Runtime Utility (APU) development headers

手コンパイルでいれるもよし、パッケージで入れるもよし。

準備が整ったら、passengerをインストールします。

次に、passengerのモジュールをコンパイルしてapacheのmodファイルとして組み込みます。

先ほどのライブラリ群が正常にインストールされていれば、以下のような表示が出ます。

一つでもNotFoundが出たらインストールできません
続けて、勝手にコンパイルしていると思います。

コンパイルが完了すれば、以下のような設定のサンプルが表示されるので、それをapacheの設定ファイルに追記します。

/etc/apache2/conf.d/passenger.conf

というファイルを作成し、設定を書き込みます。

LoadModuleの行からPassengerRubyの行までの3行です。

apacheを再起動します。

エラーが無ければ、ここまでは正常に完了です。

次に、動かすプロジェクトの設定をします。

httpd.confに

以下のVirtualHostの設定を追加します。

ServerName、DocumentRoot、Directoryディレクティブは各環境にあった物を各自設定してください。

これで再度apacheを再起動します。

エラーが無ければ、アクセスしてみましょう。

これでプロジェクトをpassengerで起動できました。

 

Rails 2.*系で「rake/rdoctask is deprecated. Use rdoc/task instead (in RDoc 2.4.2+)」エラー

Rails 2.*系のプロジェクトで、rakeコマンドをたたくと、

というエラーが発生することがある。

このエラーは rake のバージョンが新しすぎるのが原因。

基本的にRails3.0.5より前のRailsでは、rakeのバージョンは0.8.7を使う。

新しいrakeが入っている場合

と実行すればよい

ar-octopus

Railsは、標準では基本的にDBひとつの構成で動く作りになっている。

大規模サイトなどで、DBの負荷も高く、DBを分割しないといけなくなった場合に

Railsの標準構成では難しくなってくる。

そこで、ar-octopus を使う。

これは、更新系の処理はマスターに接続し、参照系の処理はスレイブを参照するように設定できる。

ホームページ

github

Rails 3とRails 2.3.*に対応

インストール

Gemfileに

を追加して

実行

使い方

コンフィグファイルを設定

コンフィグファイルの場所は

#config/shards.yml

で、基本的な設定内容は

※詳しいshards.ymlファイルの設定方法はこちら

usingを使うと、データベースを切り替えることが出来る

以下の場合、Userのfindクエリーの接続先はslaveとなる

ブロックにすることで、ブロック内でのクエリーを一括して指定することが出来る

マイグレーションを実行するデータベースを指定する

レプリケーションの場合

#config/shards.yml ファイルを以下のようにする

replicated: true を設定した場合、database.ymlに設定したものがマスターになる。

Rails 3.0.5 で「uninitialized constant Rake::DSL」

Rails 3.0.5でプロジェクトを作成し、rake db:migrateなどを実行するときに

というエラーが出る。

これは、Rails 3.0.5以前ではrakeのバージョンが0.8.7以下でなければRake::DSLが無いというエラーになるという物。

なので、Gemfileの中で

というようにrakeのバージョンを指定することで解決できる。

その後、プロジェクトでロックされたgemの一覧を更新するために

を実行する必要がある。

Aptana Studio 3 でのAptanaのテーマ設定

Aptana Studio 3 にしたところ、Ruby on Railsの表示にテーマが適用されるようになった。

これはこれで、背景が黒でかっこいいのだが、SVNのベースリビジョンとの比較をかけたりすると、すべて真っ黒で良く見えない。

簡単に行くなら、テーマを変えるのがいいが、せっかくなので、Aptana Studio 3 のテーマのままでなんとかしたい。

ま、背景黒というのは諦めて、白くする

白くすると、キーワードなどが色が薄すぎて見えない

ので、色を濃くする。

そんな感じのことを地道にやって、完了した。

再構築する際に、いじった設定が消えるのが嫌なので、ここに載せる。

#bundle.rb

使い方は、bundle.rb というファイルを新規作成し、中身に上記を貼りつけて保存

その後、Aptanaを開き、[preferences]のAptanaのThemeを開き、Importする。

carrierwave

carrierwaveは、ファイルアップロード用のプラグインで、attachment_fuと同じようなやつ。

インストール

Gemfileに

を追加

carrierwave用のファイルをジェネレータで作成する

以上のコマンドを実行すると

app/uploaders/image_uploader.rb

ファイルが作成される

モデルの作成

出来上がったマイグレーションファイルのupに以下を追加

モデルの設定

画像の保存先をファイルシステムに設定

app/uploaders/image_uploader.rb

ファイルを開き、

を追加

アップロードしたファイルのサイズのバリエーションを設定

app/uploaders/image_uploader.rb

に以下の設定を追加

[50,50]は画像サイズ
:resize_to_fit は画像の縮小方法で、縦か横の長いほうを50pxにして、縦横比維持したまま縮小
:scaleにすれば、縦横50pxで縮小

thumbのURLを取得するには

とする

Passengerで動かすRailsプロジェクトで、rMagickを使う時の設定

ImageMagickのをソースからインストール
※/usr/localに入るので、rootで実行

/usr/local/libをライブラリ登録

/etc/ld.so.conf.dに
ImageMagick.confファイルを作成
ファイルの中に

/usr/local/lib

を記入
ldconfigを実行

rmagickのインストール

rescue_from でコントローラごとに例外時のアクションを指定

コントローラで rescue_from を指定することで、そのコントローラで例外が発生したときなどに実行する処理を指定することが出来る。

Rails3 で、日本語化

Rails3の日本語化をする

#config/application.rbファイルの編集

このファイルに日本語で動くことを指定する設定を追加する

#config/localesディレクトリにjp.ymlファイルを設置
jp.ymlファイルの中身は

Rails3で、productionで起動したときにpublic内のファイルがnot foundになる件

rails3のプロジェクトを作成し、起動時に

という感じでプロダクションモードで起動したときに、なぜかpublic配下のファイルがすべてNot Foundになってしまう。

これは、config/environments/production.rb ファイルの中の

config.serve_static_assetsという設定があるのだが、これをtrueに設定してやることで、表示できるようになる。

ちなみに、サーバに配置してpassengerなどでproductionモードで実行した場合は

config.serve_static_assetsの設定はfalseのままで問題ない。

rails s -e productionで実行した場合にこの現象が出るようだ。

 

日本語のメールを送信する

代々、Railsでの日本語メールはパッチを当てるか処理を書かないと、普段日本で流通しているメールの形式にはならない。

ようするに、エンコーディングが違うのである。

RailsでActiveMailを使って普通に送信すると、エンコーディングをUTF-8で送信してしまう。

ThunderBirdとかGMailとかだと、その辺を勝手に解釈して正常に表示されてしまうが

日本にはいまだにエンコードがUTF-8では正しく表示されないメーラーがあったりする。

これに対応するには、エンコーディングをUTF-8ではなく、ISO-2022-JPでメールを送る必要がある。

ということで、さっそく変換するためのパッチを入れる

http://d.hatena.ne.jp/hichiriki/20101026/1288107706

で公開されているコードを参考にmail_fix.rbファイルをconfig/initializersに入れる

#config/initializers/mail_fix.rb

メール送信用のコードを作成する

app/mailerディレクトリにbuy_list_mailer.rbファイルが作成される

このファイルを編集

メールを送信するときは

コントローラなどで

BuyListMailer.send_buy_list(buys).deliver

とすれば、メールを送信できる。

 

camelizeとunderscore

AdminUserなんていうクラスがあるとして、

admin_user

という文字列を欲しい時に

という感じで使う

逆にしたい場合は

pluralizeとsingularizeで、単数形、複数形変換

複数形で書かれた英語表記の文字列を単数形に変換したい場合、または

単数形を複数形に変換した場合に使用する。

userという文字列がある場合

となる

will_paginate

ホームページ

github

まだタグでv3.0.0正式対応のものがないようなので、preを使う

インストール

Gemfileに

を追加して

実行

使い方

一覧表示アクションの中で、一覧取得の処理を変更

1ページに表示されるデータの件数を設定

Articleモデルに

を追加

ページ切り替えのリンクをビューに追加

articles/index.html.erbを開き

の行の上あたりに

を追加

rspec

デファクトスタンダードな、Railsのテストツール

ホームページ

公式

まだタグでv3.0.0正式対応のものがないようなので、bataを使う

インストール

Gemfileに

を追加して

実行

rspec用タスクを生成

使い方

  • テスト対象のファイルをとりあえず追加
  • scaffoldで作成したファイルに対してrspecのファイルを作成
  • マイグレーション実行
  • テスト実行
  • 以下のような実行結果がでるはず

    Startedの下にドット「.」が出るが、これは一つのテストケースを実行して正常に終了したという表示
    ここが「F」になれば、テストケースがエラーになったということ。
    *はペンディングなテストケース
  • 以下作成中

FactoryGirl

fixtureの代替となるツール

ホームページ

Github

インストール

Gemfileに

を追加して

実行

使い方

  • 定義
    specフォルダの下にfactoriesフォルダを作成
    このフォルダの中にrbファイルを作成し、そこにデータのひな形を作成する
    #spec/factories/users.rb 
  • ひな形を元にデータを作成
  • 連番の付いたデータを作成
    まず、factories/users.rbファイルに以下を追加
    #spec/factories/users.rb 

    ひな形の中のemailのデータ部分を以下に書き換え

    もしくは、直接以下のように書く
  • 以下作成中

devise

DeviseはWardenに基づくRailsのフレキシブルな認証プラグインです。
特徴は

  • Rackベース
  • Railsエンジンに基づく完全なMVC
  • 複数ロール(複数テーブル)が可能
  • モジュール方式概念に基づいている

ホームページ

インストール

Gemfileに

を追加して

実行

使い方

deviseを使用するために必要な最低限のファイルをインストールする

モデルを作成する

マイグレーション実行

Homeコントローラを追加(トップページのつもり)

home_controller.rbにログイン用のbefore_filter追加

このbefore_filterの追加で、HomeControllerへのアクセスはすべてユーザのみ可能となる。もしユーザでない場合、ログイン画面に転送される。
#app/controller/home_controller.rb 

※ここのauthenticate_user!のuserは、rails generate deviseで追加したモデル名
それによって、ロール(モデル)分けが出来るみたい

routes.rbの修正

HomeControllerのindexをルート指定する
#config/routes.rb
に以下を追加 

不要なファイルを削除

#public/index.html
このファイルを削除
このファイルがあると、routes.rbにroot設定したものが呼び出されない

サーバの起動

http://localhost:3000にアクセス

http://localhost:3000/にアクセスすれば、ログイン画面が表示される
この画面が気に入らなければ、ビューをカスタマイズすることが出来る

ビューのカスタマイズ

これで
#app/views/devise の配下にカスタマイズ用のビューが作成される
ビューだけのカスタマイズでは対応出来ない場合、コントローラもカスタマイズ出来る

deviseで使用する項目やメッセージの日本語化

#config/locales/devise.en.yml
このファイルをコピーしてdevise.jp.ymlにする。
ファイルを開き、3行目あたりのen:という所をjp:に変更。
各項目を日本語化する

コントローラのカスタマイズ

#app/controller/SessionsController.rbファイルを作成し
以下のようにクラスを継承します 

app/views/devise/sessions というディレクトリを app/views/sessionsに移動する。

routes.rbにカスタマイズしたコントローラを使うように設定を追加

Authlogic

認証処理
openIDとかLDAPとかと連携して認証するためのプラグインが存在する

ホームページ

Github

Rails 3 に対応していないようなので、フォークの中からRails 3 対応中の物を探す
新しい物が良いな~と言うことで、
http://github.com/crossroads/authlogic
あたりが良いか?
だが、安定して使える物を探す必要はある。
オリジナルがRails 3 に対応すれば、それを使いたい。

インストール

Gemfileに

を追加して

実行

セッションモデルを追加

ユーザモデルを追加

ユーザテーブルのマイグレーションファイルを修正

#db/migrate/20100903092404_create_users.rb

マイグレーション実行

ユーザモデルの修正

#app/models/user.rb

ユーザセッションコントローラの作成

以下作成中