「Ruby」カテゴリーアーカイブ

RSpec の使い方

Rubyist Magazine - スはスペックのス 【第 1 回】 RSpec の概要と、RSpec on Rails (モデル編)
Rubyist Magazine - スはスペックのス 【第 2 回】 RSpec on Rails (コントローラとビュー編)
RSpec-1.1.4: Overview
Railsアプリのプラグインとしてインストールする

$ cd vendor/plugins
$ git clone git://github.com/dchelimsky/rspec.git
$ git clone git://github.com/dchelimsky/rspec-rails.git
$ cd ../../
$ ruby script/generate rspec

gitのインストールが必要。
Git - Fast Version Control System
mac osxはインストーラがある。Windowsはcygwinでインストールできる。

rubyのprivateとprotected

Rubyでは、C++やJavaのprivateと異なり、サブクラスからでもスーパークラスのprivateメソッドを呼ぶことができる。
Rubyにおけるprotectedとprivateの違いは、レシーバが付けられるかどうかであり、サブクラスから呼べるかどうかではない。
privateメソッドにはレシーバを付けられないので、同じクラスの別のインスタンスのprivateメソッドは呼べない。このような場合にprotectedを使用する。
protectedメソッドは、そのメソッドを持つオブジェクトもメソッド定義式内でなければ呼び出せない。
クラス/メソッドの定義 - Rubyリファレンスマニュアル

Windowsでgem install jsonでエラー

Windows環境で、gemでjsonをインストールしようとしたら、以下のエラーになった。

$ gem install json
Building native extensions.  This could take a while...
ERROR:  Error installing json:
        ERROR: Failed to build gem native extension.
c:/ruby/bin/ruby.exe extconf.rb install json
creating Makefile
nmake
'nmake' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
Gem files will remain installed in c:/ruby/lib/ruby/gems/1.8/gems/json-1.1.2 for
 inspection.
Results logged to c:/ruby/lib/ruby/gems/1.8/gems/json-1.1.2/ext/json/ext/parser/
gem_make.out

Visual Studio 2005をインストールしているので、
"C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\vsvars32.bat"
をコマンドプロンプトから実行して環境変数を設定。
※このvsvars32.batはとても便利。ILDasmなどいろいろなツールへのパスを設定してくれる。
再び gem install jsonすると、今度は以下のエラー。

$ gem install json
Building native extensions.  This could take a while...
ERROR:  Error installing json:
        ERROR: Failed to build gem native extension.
c:/ruby/bin/ruby.exe extconf.rb install json
creating Makefile
nmake
Microsoft(R) Program Maintenance Utility Version 8.00.50727.762
Copyright (C) Microsoft Corporation.  All rights reserved.
        c:\ruby\bin\ruby -e "puts 'EXPORTS', 'Init_parser'"  > parser-i386-mswin
32.def
        cl -nologo -I. -Ic:/ruby/lib/ruby/1.8/i386-mswin32 -Ic:/ruby/lib/ruby/1.
8/i386-mswin32 -I. -MD -Zi -O2b2xg- -G6  -c -Tcparser.c
cl : コマンド ライン warning D9035 : オプション 'Og-' の使用は現在推奨されていま
せん。今後のバージョンからは削除されます。
cl : コマンド ライン warning D9002 : 不明なオプション '-G6' を無視します
parser.c
c:\ruby\lib\ruby\1.8\i386-mswin32\config.h(2) : fatal error C1189: #error :  MSC
 version unmatch
NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio 8\VC\BIN\c
l.EXE"' :
Stop.
Gem files will remain installed in c:/ruby/lib/ruby/gems/1.8/gems/json-1.1.2 for
 inspection.
Results logged to c:/ruby/lib/ruby/gems/1.8/gems/json-1.1.2/ext/json/ext/parser/
gem_make.out

fatal error が発生しているc:\ruby\lib\ruby\1.8\i386-mswin32\config.hを修正。
ぼくの環境のcl.exeのバージョンは、14.00.50727.762なので、

#if _MSC_VER != 1200
#error MSC version unmatch
#endif

を、

#if _MSC_VER < 1200
#error MSC version unmatch
#endif

に修正すると、無事インストール完了!
参考: 2008-02-03 - mallowlabsの備忘録

Ruby-GetText

Ruby-GetText の導入
Ruby-GetText の導入 - Rails で行こう! - Ruby on Rails を学ぶ
Windowsの場合は、gtk+-win32-devel をインストールしておく。
Glade/Gtk for Windows

モデルの修正
モデルで修正する必要があるのは、独自の検証処理用メッセージと、データベースとは直接結びつかないフィールド。
フィールドは、N_('クラス名|フィールド名')で定義する。
パタメータ付きの翻訳

flash[:notice] = _('Event %{event} was successfully created.') % {:event => @event.title}
msgid "Event %{event} was successfully created."
msgstr "イベント「%{event}」を登録しました。"

Ruby-GetTextの詳しい説明
Ruby on RailsでRuby-GetText-Packageを使う - よたらぼ 保管庫
ActiveRecord::Observer + GetTextで翻訳文字列が抽出できなくなる
Observerを使用していると、データベースのテーブル名とフィールド名が自動的に翻訳文字列として抽出されなくなる。以下に回避方法あり。
よたらぼ(2007-10-24)
Emacsでpoファイルを編集
MacOSXのCarbon Emacsで.poファイルを開いて編集しようとしたら、普通に編集できない。困ったなと思ったが、これはPOモードになっているからで、実は便利だった。
Rails Ruby-GetText は、emacs のPOモードでさらに快適:Goodpic

yamlのコメントアウト

「#」から行末までがコメントになります。範囲コメントはありません。

「...」だけの行があると、それ以降は読み込まれません。これは Ruby における「__END__」と同じようなものです。この機能は、エラーがあった箇所を絞り込むときに便利です。

プログラマーのための YAML 入門 (初級編)

symfony(1.0)のfixturesで「...」を使ってみたけど、効かなかった。Spyc.class.php が対応していないのだろう。

===演算子

Part2 Rubyに学ぶ「Ruby on Railsの正体」:ITpro

def normalize_input(user_input)
 return case user_input
 when Numeric
  user_input # 数値はそのまま
 when 'inf'
  1.0 / 0.0 # infは無限大
 when 'a' .. 'f'
  user_input.hex # aからfまでの文字を16進数と解釈
 when /^[0-9]+$/
  user_input.to_i # 数字からなる文字列を数値化
 else
  raise # それ以外はエラー
 end
end
def normalize_input(user_input)
 return if user_input.kind_of? Numeric then
  user_input
 elsif 'inf' == user_input then
  1.0 / 0.0
 elsif ('a' .. 'f').include? user_input then
  user_input.hex
 elsif /^[0-9]+$/.match? user_input then
  user_input.to_i
 else
  raise
 end
end

Object#===メソッドは,デフォルトでは同値演算子==を呼び出します。
このため,2番目の条件判定は,'inf' == user_inputとして機能します。
一方,Classクラスでは===メソッドはオーバーライドされ,クラスのインスタンスであるかどうかを調べる kind_of?メソッドと同様の機能を持つようになっています(図2)。これにより,最初の「クラスのインスタンスであるかどうか」という条件判定がうまくいくのです。
同様に,Range(範囲)クラスでは,範囲内であるかどうかを判定するinclude?メソッドであるかのようにオーバーライドされ,Regex(正規表現)クラスでは,マッチするかどうかを判定するmatch?であるかのようにオーバーライドされています。
Rubyの標準ライブラリは,クラスごとに適切な実装でObject#===をオーバーライドすることで,case式の柔軟な挙動を実現しています。