人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: tobiyoshi
●カテゴリ:コンピュータ
✍キーワード:dB ePub name ON PDF
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● nuna
ベストアンサー

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ