Ruby Lambda在与myfunc一起使用时给出了一个未定义的方法。(someparam)

时间:2015-10-23 20:35:36

标签: ruby lambda sinatra

刚刚进入Ruby世界,并建立了基于Sinatra的API。

这是我的路线定义之一。 not_found在被称为& not_found时起作用,但它给出了'2015-10-23 16:31:59 - NoMethodError - 未定义的方法`状态'用于Sinatra :: FileService :: GetFiles:Module:'当被称为'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

2 个答案:

答案 0 :(得分:1)

所以看来这是一个范围问题。看起来当你用默认的param调用lambda时,它会保持外部范围。但是当你传入params时,它会创建一个新的内部范围。

更新我对found.call( params['obsId'], settings.messages['get']['200'] )的通话解决了这个问题。

答案 1 :(得分:0)

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

found[params['obsId']]

found.call(params['obsId'])

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

替换lambda定义
found = lambda do |id|
  # ...
end