「コード」カテゴリーアーカイブ

Rails 4 : TSV から seed データ を入れる


Rails で 先般 クライアント から 基本のデータを Excel で入れられるようにしてほしい という依頼がありました。 編集を行うデータだったら編集画面を作って DB で管理したほうがいいことを伝えましたが、 どうしても Excel がいいそうで。 Excel は必要以上に多機能で、すべてのデータをそのままデータベースに反映するのが難しそうであることから()めておいた方がいいと伝えて、 Excel との インポート・エクスポート が容易な TSV で対応することとなりました。 そのときの方法を書いておきます。

TSV は 内容をコピーしてそのまま表計算ソフトに貼り付けることもできますし、表計算ソフトから TSV に貼り付けることもできるので、 Excel でも扱いやすいです。 データが欠損することがあるので、その点で注意が必要です。

環境

  • Ubuntu 14.04 LTS
  • Rails 4.1.8
  • Ruby 2.2.2

方針

  1. TSV 取り込みの機能を task で作り、 rake コマンド で取りこめるようにする。
  2. rake db:seed を行ったときに、 TSV を読み込むタスクを実行するようにする。
続きを読む Rails 4 : TSV から seed データ を入れる

Rails 4 メールでのエラー通知


Rails で、エラーが出たときにメールが送信されるようにしました。

環境

  • Ubuntu 15.05 (64bit)
  • Ruby 2.2.2
  • Rails 4.1.8

昔のやり方

Rails 3 のときは、 ApplicationControllerrescue_in_public にメール送信のコードを見たことがあります。

current_user は ログインしているユーザです。 devise を利用しています。

しかし同じことをやっても意図した通りにメールは送信されませんでした。

解決法

Rails 3 のときにもあった rescue_from を使いました。

rescue_from Exception とすることで、コントローラ内の処理で発生したすべての例外を拾います。 これが rescue_from StandardError だと 単純に raise "exception!" のように例外を起こしたときの RuntimeError が拾えません。 また、0 = 1 の時に起きるような syntax error は拾いません。 拾うのはプログラムとして動いた上でのエラーです。 そして、コントローラに入る前の処理は拾いません。

重要なのは handle_exception の中の raise exception です。 handle_exception ではエラーをもみ消したいわけではなく、メールを送りたいだけです。 AOP の考え方です。 今回は簡易的に application_controller.rb にメソッドを追加しています。

send_error_mail の中で使われている current_user は gem devise で用意されているもので、ログインしているユーザを返します。 適宜変更してください。 self はどのコントローラで例外が発生したのかをメールに載せるために渡しています。 request はリクエストのURLなどを表示するのに使います。 また !Rails.env.development? で評価を行っているところがありますが、 config に書くようにできれば一番いいです。 Rails 4.2 になったらカスタムコンフィギュレーションが使えるそうなので、アップグレード後の課題としました。

注意点

コントローラに入った後の例外しか処理しないので、 コントローラに移る前の例外は別の方法で補足する必要があります。

それならばコントローラの中ではなく外側で例外処理を書けばいいという考え方もあるのですが、コントローラの中でしか参照できない値や、コントローラの中で使いやすくなっているオブジェクトなどがあるので、 applicatoin_controller.rb に処理を書きました。

続きを読む Rails 4 メールでのエラー通知

Rails シンプル ログローテーション


Rails でシンプルにログローテーションする方法です。

環境

  • Rails 4.1.8
  • Ruby 2.2.2
  • Ubuntu 15.04 (64bit)

設定

Rails の config/application.rb に次の記述を追加します。

ここでは 100 MB (104,857,600 バイト) で 最大 10 ファイル まで保存するようにしています。 要するに 1 GB までログを保存する。 また、 10 ファイル を超えると、古いものから削除されていきます。

Rails の標準では daily, weekly などのログの設定方法もありますが、その場合は古いログファイルは削除されません。

テスト方法

例えば development 環境 でテストする場合、 次のコマンドで 100 MB を超えるログファイルをあらかじめ作成しておく。

bsはブロックサイズ、countは書き込み回数を表しています。

そこで、 rails s のコマンドでサーバを起動して、 どこかのページにアクセスします。 すると、 development.log, development.log.0 ができているはずです。

Rails のロギングは、 SyslogLogger や Linux の logrotate を使う方法もあります。