如何修复“未定义方法“空”?对于...:浮动”

时间:2019-04-05 09:39:32

标签: ruby-on-rails ruby

我正在尝试创建一个非常简单的“计算”方法,但是在使用参数“?op1 = 20&op2 = 30&operation = plus”加载页面时,出现此错误:

CalcController#compute中的NoMethodError

未定义的方法“空?”为50.0:浮动。

我的方法:

def compute
        operation = params['operation']
        op1=params['op1']
        op2=params['op2']
        if operation==nil or op1==nil or op2==nil
            render plain: 'Error:invalid params...'
            return
        end
        if operation=='plus'
            render plain: op1.to_f+op2.to_f
            return
        end
end

提取的来源

body.each do |part|
    parts << part
    (digest ||= Digest::SHA256.new) << part unless part.empty?
end

[digest && digest.hexdigest.byteslice(0, 32), parts]

完整的错误堆栈:

rack (2.0.7) lib/rack/etag.rb:68:in `block in digest_body'
actionpack (5.1.7) lib/action_dispatch/http/response.rb:145:in `each'
actionpack (5.1.7) lib/action_dispatch/http/response.rb:145:in `each_chunk'
actionpack (5.1.7) lib/action_dispatch/http/response.rb:126:in `each'
actionpack (5.1.7) lib/action_dispatch/http/response.rb:74:in `each'
actionpack (5.1.7) lib/action_dispatch/http/response.rb:473:in `each'
rack (2.0.7) lib/rack/etag.rb:66:in `digest_body'
rack (2.0.7) lib/rack/etag.rb:29:in `call'
rack (2.0.7) lib/rack/conditional_get.rb:25:in `call'
rack (2.0.7) lib/rack/head.rb:12:in `call'
activerecord (5.1.7) lib/active_record/migration.rb:556:in `call'
actionpack (5.1.7) lib/action_dispatch/middleware/callbacks.rb:26:in `block in call'
activesupport (5.1.7) lib/active_support/callbacks.rb:97:in `run_callbacks'
actionpack (5.1.7) lib/action_dispatch/middleware/callbacks.rb:24:in `call'
actionpack (5.1.7) lib/action_dispatch/middleware/executor.rb:12:in `call'
actionpack (5.1.7) lib/action_dispatch/middleware/debug_exceptions.rb:59:in `call'
actionpack (5.1.7) lib/action_dispatch/middleware/show_exceptions.rb:31:in `call'
railties (5.1.7) lib/rails/rack/logger.rb:36:in `call_app'
railties (5.1.7) lib/rails/rack/logger.rb:24:in `block in call'
activesupport (5.1.7) lib/active_support/tagged_logging.rb:69:in `block in tagged'
activesupport (5.1.7) lib/active_support/tagged_logging.rb:26:in `tagged'
activesupport (5.1.7) lib/active_support/tagged_logging.rb:69:in `tagged'
railties (5.1.7) lib/rails/rack/logger.rb:24:in `call'
actionpack (5.1.7) lib/action_dispatch/middleware/remote_ip.rb:79:in `call'
actionpack (5.1.7) lib/action_dispatch/middleware/request_id.rb:25:in `call'
rack (2.0.7) lib/rack/runtime.rb:22:in `call'
activesupport (5.1.7) lib/active_support/cache/strategy/local_cache_middleware.rb:27:in `call'
actionpack (5.1.7) lib/action_dispatch/middleware/executor.rb:12:in `call'
actionpack (5.1.7) lib/action_dispatch/middleware/static.rb:125:in `call'
rack (2.0.7) lib/rack/sendfile.rb:111:in `call'
railties (5.1.7) lib/rails/engine.rb:522:in `call'
puma (3.12.1) lib/puma/configuration.rb:227:in `call'
puma (3.12.1) lib/puma/server.rb:660:in `handle_request'
puma (3.12.1) lib/puma/server.rb:474:in `process_client'
puma (3.12.1) lib/puma/server.rb:334:in `block in run'
puma (3.12.1) lib/puma/thread_pool.rb:135:in `block in spawn_thread'

1 个答案:

答案 0 :(得分:1)

发生错误是因为您正在尝试检查Float对象是否为empty?empty?是为可枚举类型(数组,哈希等)的对象定义的方法。要检查对象是否包含某个值,可以使用.blank?。 在您的代码中,(digest ||= Digest::SHA256.new) << part unless part.empty?这一行可以更改为(digest ||= Digest::SHA256.new) << part unless part.blank?

Rails提供了一些非常相似的方法,下面简要介绍一下:

empty?:是为可枚举对象(数组,哈希等)定义的方法。
blank?:为使用空值初始化或为null的对象定义。因此"".blank?将返回true以及nil.blank? .nil?:这是一种专门检查变量的值是否为nil的方法。 "".nil?将返回false,但是nil.nil?将返回true。

有关更多详细信息,您可以查看this blog

更新:
如问题更新中所述,此错误似乎发生在机架级别,而不是主源代码中。这样做的原因是Rack中间件希望处理字符串,而不是其他类型的对象。
compute动作中,我们在render plain: op1.to_f+op2.to_f行中渲染一个float对象。这会导致Rack引发错误,因为它希望仅接收用于渲染的字符串。可以通过如下方式将要提交的内容类型转换为字符串来解决:
render plain: (op1.to_f+op2.to_f).to_s @Emil Kampp为this answer提供了帮助,对调试起到了帮助。