回顾一个同事的PR我遇到了一个我以前没见过的模式,其中调用了一个私有方法,如果该方法失败,则or return
附加到末尾。我found a blog post mentioning this (number 2)但我觉得很奇怪。
代码排序如下:
class OurController < ApplicationController
def index
amount = BigDecimal.new(params[:amount]).to_i
if amount < 0
cancel_processing(amount) or return
else
process(amount)
end
render json: {success: true}
end
private
def cancel_processing(amount)
response = CancelProcessingService.call(amount)
if response
log_stuff
else
render json: {error: true} and return
end
end
end
由于从方法内部调用渲染错误,因此它没有结束,因此它将在index
动作结束并且双重渲染(在{{1}之后没有or render
})。
这对我来说就像是一种气味。 cancel_processing
和render
在before_filters中受到尊重,因此在方法中不受尊重会感觉不一致。也许它只是感觉不对,因为我之前没有遇到过这种return
模式,但我问:是否有办法让Rails从方法中尊重or return
(哪些不是before_filters或行动)?
我觉得提倡重写这些方法来简单地返回JSON,并在方法中稍后将响应传递给渲染 - 但如果这是一个正常模式,那么我没有理由建议。
你有什么想法?
答案 0 :(得分:2)
axis: {
x: {
type: 'category',
categories: ['1235', '2523', '2563', '1234']
}
}
是一种虚假的模式。 Rails文档在几个地方使用它,但我相信它不应该。这是假的,因为尽管render ... and/or return
在成功时返回一个真值(渲染的响应体),但是当它失败时它不会返回虚假值但会引发错误。因此,当它返回一个假值时,处理不存在的情况是没有意义的。 (这同样适用于render
。)
在某项操作中,为避免误导任何人redirect_to
的工作方式,请执行
render
渲染然后退出。
在一个操作调用的私有方法中,你不能说render # options
return
并退出调用操作,因为Ruby方法不会那样工作。相反,使方法返回一个值,该值可以解释,并在适当的时候提前返回。像这样:
return