【问题标题】:Ruby Lambda's giving an undefined method when used with myfunc.(someparam)与 myfunc 一起使用时,Ruby Lambda 给出了一个未定义的方法。(someparam)
【发布时间】:2015-10-27 01:43:44
【问题描述】:

刚刚涉足 Ruby 世界,并建立一个基于 Sinatra 的 API。

这是我的路线定义之一。 not_found 在被称为 &not_found 时有效,但它给出 '2015-10-23 16:31:59 - NoMethodError - Sinatra::FileService::GetFiles:Module:' 的未定义方法 `status' 当称为 'not_found.( params [ 'obsId'])'。

有人可以提供任何方向吗?非常感谢!

 def self.registered(app)

    not_found = -> id = 'undefined' {
      status 404
      content_type :json
      { 
        :message => settings.messages['get']['404'], 
        :data => {
          id: _id
        } 
      }.to_json
    }

    found = -> _id { 
      status 200
      content_type :json
      { 
        :message => settings.messages['get']['200'], 
        :data => {
          :id => _id
        }
      }.to_json
    }

    app.get '/', &not_found

    app.get '/:obsId' do

      if params['obsId'] == '1'
        found.( params['obsId'] )
      else 
        not_found.( params['obsId'] )
      end

    end

  end

【问题讨论】:

  • 你确定要在里面吗? not_found.( params['obsId'] ) 在我看来不合适。试试not_found[params['obsId']]not_found.call(params['obsId'])
  • 我使用的是支持 .() 而不是 .call() 的“ruby 2.0.0p481”。 (如果我错了,请纠正我)
  • 我的错。有很多东西要跟上!

标签: ruby lambda sinatra


【解决方案1】:

看来这是一个范围界定问题。似乎当您使用默认参数调用 lambda 时,它会保持外部范围。但是当你传入参数时,它会创建一个新的内部范围。

更新我对found.call( params['obsId'], settings.messages['get']['200'] ) 的电话解决了它。

【讨论】:

    【解决方案2】:

    您是否正在运行 Ruby 1.8? .() 语法当时并不存在。您必须在 1.8 中使用以下两种表示法之一:

    found[params['obsId']]
    
    found.call(params['obsId'])
    

    但在 Ruby 1.8 中,用于定义 lambda 的 -> {} 语法也不存在。您可能会遇到更多错误,需要将 lambda 定义替换为

    found = lambda do |id|
      # ...
    end
    

    【讨论】:

    • 我正在使用 ruby​​ 2.0.0p481。我会尝试使用旧式语法。
    • 从脚本内部仔细检查您的 ruby​​ 版本。有时可能是 RVM/Rbenv 配置不正确,而您正在系统 Ruby 上运行。
    猜你喜欢
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    相关资源
    最近更新 更多