Post というモデルを持つ標準の Rails 2.3.5 アプリがあります。Post には url という属性があり、次の getter が定義されています。
def url
p = 'http://'
u = self[:url]
u.starts_with?(p) ? u : "#{p}#{u}"
end
ロードするscript/console
とPost.first.url
、目的の結果が得られます (たとえば、属性の true 値が foo.com の場合、http://foo.com が返されます) 。
ただし、form_for
ブロックがあり、次のようなform.text_field :url
ことをすると、http:// が前に付いた URL は返されません。むしろ、単純に foo.com を返します。
form_for は ActiveRecord モデルの属性にどのようにアクセスしますか? オーバーロードされたゲッターをバイパスしているようです。