81

我正在使用 railstutorial.org 学习 Rails,但我对一些事情感到困惑:在本章中,作者告诉我们在控制台中使用respond_to?User 对象上的方法进行一些测试,并且它工作正常。:encrypted_password但后来,当我们为属性编写测试时,他使用了respond_to.

出于好奇,我respond_to在控制台中尝试了一个 User 对象,但我收到一条错误消息,指出该方法不存在。唉,如果我尝试使用respond_to?而不是编写测试respond_to,则测试不会运行。

有人可以解释一下区别吗,为什么测试只运行respond_to

4

3 回答 3

179

Ruby 将?!视为方法名称中的实际字符。respond_to并且respond_to?是不同的。?表示这应该以 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.

于 2011-07-27T19:09:15.553 回答
4

respond_to?是一个布尔评估。(respond_to通常)用于确定显示信息。 更多信息在这里。检查方法是否存在,respond_to?如果存在则返回 true,如果不存在则返回 false。

于 2011-07-27T19:04:38.330 回答
3

该测试使用方便的助手来更加用户友好。

Ruby 是 Ruby,所以respond_to?如果你这样称呼它,那么使用旧的就可以了:

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

控制器中使用了另一个respond_to,但与您已经遇到的那些仍然无关。

于 2011-07-27T19:04:47.087 回答