我正在尝试创建一个非常简单的“计算”方法,但是在使用参数“?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'
答案 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提供了帮助,对调试起到了帮助。