【问题标题】:Confused about 'respond_to' vs 'respond_to?'对“respond_to”和“respond_to”感到困惑?
【发布时间】:2011-07-27 18:58:46
【问题描述】:

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

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

有人能解释一下区别吗?为什么测试只使用respond_to 运行?

【问题讨论】:

    标签: ruby-on-rails railstutorial.org


    【解决方案1】:

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

    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

    【讨论】:

    • 但是如果你看过书中的例子,respond_to 不是和请求类型一起使用的,而是和一个属性一起使用的。也许 Rails 覆盖了 Ruby 方法,所以它也接受属性?
    • 这是一种 RSpec 测试方法:rspec.info/documentation ...除非您将 ENV 设置为测试,否则它在控制台中不可用。
    • 我发现 Ruby 的创建者决定对两个不同的事情使用相同的语句名称“respond_to”真的很奇怪:发现对象是否有方法或响应请求类型。哦,是的,有一个?这让他们与众不同。哇。 \o/
    • 这根本不是 Ruby 的创造者。第一个是 Ruby 方法。第二个是 ActionController 上的 Rails 方法。第三个是 RSpec 库方法。 ?和 !在Ruby中有意义,那么respond_to和respond_to有什么区别?等于 trim 和 trimr 的差。
    • 为了避免将来的用户感到困惑,ruby 中方法名称末尾的? 确实保证该方法将返回一个布尔值。 ? 只是方法名称的一部分,就像任何其他字符一样。问号方法应该返回一个布尔值是一个公认的约定,但它并没有被普遍遵循。 (例如github.com/rails/rails/pull/5329 和问号方法没有返回布尔值时引起的骚动)
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2013-07-27
        • 2021-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-29
        • 2014-11-02
        • 1970-01-01
        • 2014-03-18
        相关资源
        最近更新 更多