在控制器上的私有方法内处理和流动时出错

时间:2016-03-10 23:53:29

标签: ruby-on-rails ruby

回顾一个同事的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_processingrender在before_filters中受到尊重,因此在方法中不受尊重会感觉不一致。也许它只是感觉不对,因为我之前没有遇到过这种return模式,但我问:是否有办法让Rails从方法中尊重or return (哪些不是before_filters或行动)?

我觉得提倡重写这些方法来简单地返回JSON,并在方法中稍后将响应传递给渲染 - 但如果这是一个正常模式,那么我没有理由建议。

你有什么想法?

1 个答案:

答案 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