erb とローカル変数とインスタンス変数
erb を使う。
あるところに値をぽこっと埋め込みたいとする。このとき、erb ファイル上では
var | ローカル変数 |
@var | インスタンス変数 |
どちらの書き方がよいか?
ローカル変数を書いただけの場合、これはローカル変数の参照と解釈されるが、これが未定義の場合は同名のメソッド呼び出しが行われ、メソッドも定義されていない場合は NameError となる。つまり、erb ファイル上に書かれた変数については必ず何らかの値をセットしなければいけない。
インスタンス変数で置いておけば未定義の場合は nil が返るのでこの辺りを気にする必要はなくなるが、インスタンス変数ってことはインスタンス内の名前空間を消費してしまう。変数名のバッティングや予期せぬ変数の内容を取り出しちゃったりなんて問題が起きるかも。
いずれにせよちゃんと erb ファイル上で利用している変数に合わせて適切に値をセットしろってことにつきるわけだけど…。いわゆるテンプレートシステムに慣れていると、この作りはいささかびっくりする。1まぁ、グローバル変数バリバリの素の PHP でテンプレートのようなものを作ったような状態、と思えばいいのかな。
[8/13 追記] 結局今回はローカル変数のハッシュを置くことにした。erb ファイル上でもハッシュの記法で書かなきゃならないのが多少うざいけど、簡単にエラーになっちゃわないし、インスタンス変数の名前を消費しちゃうよりマシかなぁという判断。本当は erb のコンパイルのエラーを通常の undefined なんちゃらかんちゃらのエラーとは別な形で拾えれば全部単純なローカル変数の形で書けた方が作業の分担も楽にできるんだけど、そこまで余力がなかった…。
明示的に値をセットするプロセスが存在しないし。 ↩