messaliberty

hulor と開発チームの最新情報

Archive for the ‘programming’ Category

[Rails] ActiveRecord で DateTime を使う

10月 21st, 2009 投稿者: ice

ActiveRecord の :datetime は ruby Time class に対応してるんだけど、
ruby の Time class が 0001-01-01 00:00:00 とかの、かなり昔とか未来の日付に対応してない。
(ActiveRecord が 0001-01-01 00:00:00 を 2001:01:01 00:00:00 に変換してしまう)

なので ActiveRecord の :datetime 周りの処理を上書きして、DateTime class を使うようにする。

テスト環境:

  • Ubuntu 9.04
  • ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]
  • rails 2.3.2 – 2.3.4
  • mysql Ver 14.12 Distrib 5.0.75, for debian-linux-gnu (i486) using readline 5.2

以下のコード active_record_datetime_ext.rb を RAILS_ROOT/config/initializers にコピーするだけ。
(続きを読む…)

[Ruby on Rails] view を編集したのに反映されない

5月 20th, 2009 投稿者: ice

Ruby on Rails 2.3.2 を使用時のこと。

時々、Rails の view を編集したのに反映されないことがある(あった)。
なぜか、編集前の古い内容が表示され続ける。

原因

app/view/* ディレクトリ以下に、例えば app/view/users/ ディレクトリ以下とか、
edit.html.erb.~BASE~ のような “.html.erb.*” で終わるファイルが転がっていることがある。
.html.erb の後にさらにドット(.) で始まる文字が付いているファイルが。
こんな感じのファイルが転がっていると rails が view を描画するときに、 edit.html.erb.~BASE~ の様なゴミファイルの方を使用してしまう。

ちなみに .~BASE~ で終わるファイルは svn (subversion) が古いリビジョンのファイルと比較をするときに作ってしまったりする。

解決策

こんな感じで *.~BASE~を削除する:

 % cd project_dir
 % find . -name "*html.*"
 ./app/views/userss/edit.html.erb.~BASE~
 ./app/views/userss/show.html.erb.~BASE~
 % find . -name "*.~BASE~" -exec rm {} \;

[Ruby on Rails] uninitialized constant ActiveSupport::~::ForRspec

4月 21st, 2009 投稿者: ice

今日、rails のディレクトリで rake を実行すると↓のエラーが出るようになってしまった。
全く身に覚えがない。

% rake -T
(in /home/ice/messa/hulor)
rake aborted!
uninitialized constant ActiveSupport::Testing::SetupAndTeardown::ForRspec
/home/ice/messa/hulor/Rakefile:12
(See full trace by running task with --trace)

今回の件に関係あると思われる gem のパッケージのバージョン。

  • rails 2.3.2
  • rspec 1.2.4
  • rspec-rails 1.2.4

何をしたらこうなったのか全く覚えてないけど、たぶん rails をプロジェクト内にインストールし直したんだと思う(システムにでななく)。
↓みたいなことをしたのか?覚えてない。

% rake rails:freeze:edge

#801 ‘No such file to load’ when running ‘rake spec’

Sounds like you’ve got rails edge, not rails-2.3.2. These files moved post-2.3.2 – same with ForRspec – that’s all in rails edge, which is now moving towards rails-3.0, and is not supported by rspec yet in any released version, nor in rspec’s own edge.

↑の記事曰く、さっきのコマンドでインストールされてるのは rails の 2.3.2 ではないらしい。
バージョン指定しなくてもうまくいってたのはただのラッキーだったっぽい。
これを直すには、次のコマンドを実行すればOK。

% rake rails:freeze:edge RELEASE=2.3.2
% rake rails:freeze:edge RELEASE=2.3.2
(in /home/ice/messa/hulor)
cd vendor
Downloading Rails from http://dev.rubyonrails.org/archives/rails_2.3.2.zip
Unpacking Rails
rm -rf rails
rm -f rails.zip
rm -f rails/Rakefile
rm -f rails/cleanlogs.sh
rm -f rails/pushgems.rb
rm -f rails/release.rb
touch rails/REVISION_b10fb7e7bcb5efea6c93ae52bad125887cfc235c
cd -
Updating current scripts, javascripts, and configuration settings

直った. //

[Ruby] RSpec の使い方 – 01 クイックスタート

2月 24th, 2009 投稿者: ice

RSpec は Ruby の BDD(Behavior Driven Development). テストフレームワークの1つです。

Install RSpec

% sudo gem install rspec

Quickstart

下の方にあるサンプルコードのディレクトリ構成です。
lib/ ディレクトリに開発するライブラリを配置。
spec/ ディレクトリに spec(テスト) コードを配置。

  • sample_project/
    • lib/sample.rb サンプルのライブラリ
    • spec/
      • sample_spec.rb sample.rb のテストプログラム
      • spec_helper.rb すべてのテストで共通する処理を書くスクリプト

ディレクトリを作成

(続きを読む…)

[Ruby] ActiveRecord で複数のデータベースに接続する方法

2月 16th, 2009 投稿者: ice

時々1つのアプリケーションから複数のデータベースにアクセスする必要に迫られることがあります。
たとえば、他のアプリの作ったデータベースにアクセスしたい場合とか。
でも、ActiveRecord のサンプルプログラムのほとんどは、 ActiveRecord::Base に直接設定をセットしているし、
ActiveRecord::Base を使ってコネクションを作成しているので、複数のデータベースの接続を AR をつかって張ることができないです(やりにくい)。
ではどうするか?

ただ、ActiveRecord のサブクラスを作成するだけです。

ActiveRecord::Base のサブクラスは親クラスの読み込んだ設定や、データベースへの接続へアクセスできるので、
まず ActiveRecord::Base のサブクラスを作成して(ここでは BaseDB)これにデータベースの設定をセットします。
それから、 BaseDB を継承した子クラスを作って、その子クラスにそれぞれデータベースへの接続を張らせます。
たぶん、ActiveRecord::Base に直接設定をセットしたり、ActiveRecord::Base で直接データベースへの接続を張るよりも、
子クラスの方でなんとかした方が良さそうです。とくに将来複数のデータベースとかを扱う状況になるかもしれない場合・・・。 (続きを読む…)