对'respond_to'与'respond_to?'感到困惑

时间:2011-07-27 18:58:47

标签: ruby-on-rails railstutorial.org

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

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

有人可以解释我的不同之处,为什么测试只与respond_to一起运行?

3 个答案:

答案 0 :(得分:158)

Ruby将?!视为方法名称中的实际字符。 respond_torespond_to?不同。 ?表示此应该以true或false响应(按惯例;这不是必需的)。具体做法是:

respond_to?Ruby method,用于检测该类是否具有特定方法。例如,

@user.respond_to?('eat_food')
如果User类上有eat_food方法,

将返回true。

respond_toRails method,用于响应特定的请求类型。例如:

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

,否则在您的控制台中无法使用此功能

答案 1 :(得分:4)

respond_to?是布尔评估。 respond_to用于(通常)用于确定显示信息。 More information hererespond_to?检查方法是否存在,如果存在则返回true,否则返回false。

答案 2 :(得分:3)

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

Ruby是Ruby,所以如果用这种方式调用它,那么使用好的respond_to?就可以了:

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

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