web-dev-qa-db-ja.com

「respond_to」と「respond_to?」について混乱しています

私はRailsを学んでいますが、何かについて混乱しています: この章 で著者は、 Userオブジェクトでrespond_to?メソッドを使用してコンソールを実行し、正常に機能しますが、後で:encrypted_password属性のテストを記述するときに、respond_toを使用します。

好奇心から、ユーザーオブジェクトに対してコンソールでrespond_toを試しましたが、メソッドが存在しないというエラーが表示されます。残念ながら、respond_to?の代わりにrespond_toを使用してテストを記述しようとすると、テストは実行されません。

誰かが私に違いを説明できますか、そしてなぜテストはrespond_toでのみ実行されるのですか?

71
agente_secreto

Rubyは?!をメソッド名の実際の文字として扱います。 respond_torespond_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を実行しない限り、これはコンソールで使用できません。

159
Tim Sullivan

respond_to?はブール評価です。 respond_toは、表示情報を決定するために(通常)使用されます。 詳細はこちらrespond_to?は、メソッドが存在するかどうかを確認し、存在する場合はtrueを返し、存在しない場合はfalseを返します。

4
Micharch54

このテストでは、便利なヘルパーを使用して、よりユーザーフレンドリーにします。

RubyはRubyなので、古き良きrespond_to?この方法で呼び出すと機能します。

 @user.respond_to?(:encrypted_password).should be_true

もう一つの...がある respond_toコントローラーで使用されますが、まだあなたが既に会ったものとは何の関係もありません。

3
apneadiving