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

age*_*eto 73 ruby-on-rails railstutorial.org

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

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

有人可以解释我的区别,为什么测试只运行respond_to

Tim*_*van 162

红宝石对待?,并!为实际字符的方法名.respond_to并且respond_to?是不同的.?表示这应该以true或false响应(按惯例;这不是必需的).特别:

respond_to?是一个Ruby方法,用于检测类是否具有特定的方法.例如,

@user.respond_to?('eat_food')
Run Code Online (Sandbox Code Playgroud)

如果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
Run Code Online (Sandbox Code Playgroud)

但是,在您提供的RailsTutorial链接中,您看到RSpec方法should与RSpec的respond_to方法交互.除非您运行,否则在您的控制台中将无法使用此功能rails console test.

  • 这根本不是Ruby的创造者.第一个是Ruby方法.第二个是ActionController上的Rails方法.第三种是RSpec库方法.?而且!在Ruby中有意义,那么respond_to和respond_to之间的区别?等于修剪和修剪器之间的差异. (4认同)
  • 我发现很奇怪Ruby创建者决定使用相同的语句名称"respond_to"来做两件事:发现对象是否有方法或响应请求类型.哦是的,有一个?这使他们与众不同.哇.\ O / (2认同)
  • 为了避免将来的用户感到困惑,ruby中方法名称末尾的`?`确实*不保证该方法将返回一个布尔值.`?`只是方法名称的一部分,就像任何其他字符一样.那个问号方法应该返回一个布尔值是一个完善的约定,但它并没有普遍遵循.(例如参见https://github.com/rails/rails/pull/5329以及当问号方法未返回bool时引起的骚动) (2认同)