ryby on rails(rails3)での質問です。

私自身の (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))でも実行可能です。
どなたか説明していただけないでしょうか?

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2011/08/08 09:35:41

ベストアンサー

id:nuna No.1

回答回数32ベストアンサー獲得回数11

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の項に少し書いてあります。

http://api.rubyonrails.org/classes/ActiveRecord/Base.html

  • id:tobiyoshi
    そういうことでしたか。

    obj = task.done として
    if obj? でもでもエラーがでるので一体どうなっているんじゃと
    分けわからなくなっていました。done? がメソッド名と解釈するなら納得です。
    本当にどうもありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません