私はRailsを学んでいますが、何かについて混乱しています: この章 で著者は、 Userオブジェクトでrespond_to?
メソッドを使用してコンソールを実行し、正常に機能しますが、後で:encrypted_password
属性のテストを記述するときに、respond_to
を使用します。
好奇心から、ユーザーオブジェクトに対してコンソールでrespond_to
を試しましたが、メソッドが存在しないというエラーが表示されます。残念ながら、respond_to?
の代わりにrespond_to
を使用してテストを記述しようとすると、テストは実行されません。
誰かが私に違いを説明できますか、そしてなぜテストはrespond_to
でのみ実行されるのですか?
Rubyは?
と!
をメソッド名の実際の文字として扱います。 respond_to
とrespond_to?
は異なります。 ?
は、このshouldがtrueまたはfalseで応答することを示します(慣例により、これは必須ではありません)。具体的には:
respond_to?
は、クラスに特定のメソッドがあるかどうかを検出するための Rubyメソッド です。例えば、
@user.respond_to?('eat_food')
User
クラスにeat_food
メソッドがある場合、trueを返します。
respond_to
は、特定の要求タイプに応答するための Railsメソッド です。例えば:
def index
@people = Person.find(:all)
respond_to do |format|
format.html
format.xml { render :xml => @people.to_xml }
end
end
ただし、提供したRailsTutorialリンクには、RSpecメソッドshould
とRSpecの相互作用 respond_to
メソッド。 Rails console test
を実行しない限り、これはコンソールで使用できません。
respond_to?
はブール評価です。 respond_to
は、表示情報を決定するために(通常)使用されます。 詳細はこちら 。 respond_to?
は、メソッドが存在するかどうかを確認し、存在する場合はtrueを返し、存在しない場合はfalseを返します。
このテストでは、便利なヘルパーを使用して、よりユーザーフレンドリーにします。
RubyはRubyなので、古き良きrespond_to?
この方法で呼び出すと機能します。
@user.respond_to?(:encrypted_password).should be_true
もう一つの...がある respond_to
コントローラーで使用されますが、まだあなたが既に会ったものとは何の関係もありません。