【发布时间】:2019-10-04 13:10:12
【问题描述】:
我知道有几个 SO 问题以及关于在 Rails 中使用 yield 的在线文章。但是我仍然无法理解下面的代码有什么问题,如果有任何建议,我将不胜感激。
在我的应用中,我有:
一个
controller,将数据传递给command类的run方法,并根据Command.run的结果返回请求状态(true/false)一个
command类,处理实际的过程,如果成功则为yieldstrue,如果失败则为false
但是,command 类似乎无法将结果传递给我的yield controller。根据我运行测试时的错误消息,我在controller 中的块似乎没有被识别为块:
# If I use "yield result":
LocalJumpError: no block given (yield)
# If I use "yield result if block_given?":
# (This is because I have "assert_response :success" in my tests)
Expected response to be a <2XX: success>, but was a <400: Bad Request>
我应该如何重写块(下面控制器中的do ... end 部分)以使yield 正常工作?或者如果问题出在其他地方,我做错了什么?
我在下面提供了我的代码的简化版本。提前谢谢!
# controller
def create
Command.run(params) do
render json: { message: 'Successfully processed request' }
return
end
render json: { message: 'Encountered an error' }, status: :bad_request
end
# command class
def run(params)
# Do some stuff, then send HTTP request
# "result" below returns true or false
result = send_http_request.parsed_response == 'ok'
yield result
end
def self.run(params)
new.run(params)
end
注意:如果我在控制器中使用 if true... else... 而不是块,并且仅使用 return 布尔结果而不是 yielding 它,则此代码有效。但在这里我想知道如何使yield 工作。
【问题讨论】:
-
1.你确定
Command.run没有在其他任何地方都没有被调用吗? 2. 您使用的是哪个 Ruby 版本? -
@eyevan 1. 控制器文件是唯一调用
Command.run的地方。 2. 我正在使用2.6.2。
标签: ruby-on-rails ruby yield