我正在使用railstutorial.org学习Rails,我对此感到困惑:
在this chapter中,作者告诉我们在控制台中使用User对象上的respond_to?
方法进行一些测试,并且它可以正常工作。但稍后,当我们为:encrypted_password
属性编写测试时,他使用respond_to
。
出于好奇,我在控制台中尝试了respond_to
,对于User对象,我得到一个错误,说该方法不存在。唉,如果我尝试使用respond_to?
而不是respond_to
来编写测试,则测试不会运行。
有人可以解释我的不同之处,为什么测试只与respond_to
一起运行?
答案 0 :(得分:158)
Ruby将?
和!
视为方法名称中的实际字符。 respond_to
和respond_to?
不同。 ?
表示此应该以true或false响应(按惯例;这不是必需的)。具体做法是:
respond_to?
是Ruby method,用于检测该类是否具有特定方法。例如,
@user.respond_to?('eat_food')
如果User
类上有eat_food
方法,将返回true。
respond_to
是Rails 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 here。 respond_to?
检查方法是否存在,如果存在则返回true,否则返回false。
答案 2 :(得分:3)
该测试使用方便的助手,使用户更友好。
Ruby是Ruby,所以如果用这种方式调用它,那么使用好的respond_to?
就可以了:
@user.respond_to?(:encrypted_password).should be_true
在控制器中使用了另一个respond_to
,但仍与您已经遇到的人无关。