对“ respond_to”和“ respond_to”感到困惑?


79

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

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

有人可以解释一下两者之间的区别,为什么测试只能与之一起运行respond_to

Answers:


171

Ruby将?!视为方法名称中的实际字符。respond_to并且respond_to?是不同的。?表示这应该以对或错响应(按照惯例;这不是必需的)。特别:

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


但是,如果您阅读本书中的示例,则response_to不会与请求类型一起使用,而是与属性一起使用。也许Rails覆盖了Ruby方法,所以它也接受属性?
agente_secreto 2011年

1
这是一种用于测试的RSpec方法:rspec.info/documentation ...除非将ENV设置为测试,否则它在控制台中将不可用。
蒂姆·沙利文

3
我发现Ruby创建者决定对两个不同的事物使用相同的语句名称“ respond_to”真的很奇怪:发现对象是否具有方法或响应请求类型。哦,是的,有一个?这使他们与众不同。哇。\ o /
JuniorMayhé2014年

4
这根本不是Ruby的创造者。第一个是Ruby方法。第二个是ActionController上的Rails方法。第三个是RSpec库方法。?和!在Ruby中具有重要性,因此response_to和response_to之间的区别是什么?等于修剪和修剪器之间的差异。
蒂姆·沙利文

2
为了避免将来的用户感到困惑,?在ruby中以方法名称结尾的方法并不能保证该方法将返回布尔值。该?是方法名的只是一部分,像任何其他字符。问号方法应返回布尔值是一种公认​​的约定,但并不是普遍遵循的约定。(例如,请参阅github.com/rails/rails/pull/5329和问号方法未返回布尔值时引起的混乱)
Andrew

4

respond_to?是布尔值评估。的respond_to是,用于确定所述显示信息中使用(一般)。 更多信息在这里。该respond_to?检查是否如果它和虚假如果没有一种方法存在,返回true。


3

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

Ruby是Ruby,因此respond_to?如果您这样称呼,可以使用旧版本:

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

respond_to控制器中还有另一种用法,但与您已经遇到的控制器无关。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.