私自身の (rubyあるいはrails)言語の知識不足からの疑問点だと思っていますが
次の部分がどうしても理解できません。
書名(epubあるいはpdf):黒田努著「はじめる! Rails3 (1) 1.0.1」
頁 : 281頁(epub), 76頁(pdf)
<%= link_to "修正", [:edit, task ] %>
<%= if task.done?
link_to("戻す", [:restart, task ], :method => :put)
else
link_to("完了", [:finish, task ], :method => :put)
end %>
の task.done? 箇所です。実行は問題無いのですが、なぜ task.done? の
記述が可能かということです。taskはDBモデルのオブジェクトです。
doneはbooleanタイプのフィールドです。
task.done は TrueClassかFalseClass
です。でもこのTrueClass,FalseClassのメソッドの中には ? は
含まれていません。ちなみにtask.doneを True あるいは falseに
変更すると(true?あるいは(true)?)実行不可でエラーが返されます。
ヘルパーメソッドの中にはなにか特別なメソッドがあるかヘルパーを
作って調べてもみましたがクエッションマーク(?)のメソッドは
ありません。尚、task.nameでも(nameはvarchar(255))でも実行可能です。
どなたか説明していただけないでしょうか?
ActiveRecord::Baseのサブクラスのインスタンスオブジェクトは、
フィールド名の末尾に?をつけたquery methodが使えます。
done と ? に分かれるわけではなく "done?" 全体がメソッド名です。
静的にメソッド定義してはおらず、Rubyのリフレクション機構を使って動的に実現しています(doneというフィールド名のメソッドも同じですが)。
Rubyの慣習として、末尾に?がつくメソッドは真偽値(true/false)を返します。
if文等で状態としてdoneかどうかを問題としている場合には、done? メソッドを使った方が、条件である事が明確になります。
if task.done?
...
end
また、boolean以外の型の場合には、値が入っているかどうかを調べるメソッドになります。
task.name?は、name が nil または ""(空白文字列)の場合にはfalse、空白以外の文字列であればtrueが返ります。
あんまり公式のドキュメントには説明がないのですが、
以下のページのAttribute query methodsの項に少し書いてあります。
コメント(1件)
obj = task.done として
if obj? でもでもエラーがでるので一体どうなっているんじゃと
分けわからなくなっていました。done? がメソッド名と解釈するなら納得です。
本当にどうもありがとうございました。