Rails 未发送救援标准错误

Rails rescue standard error doesn't get sent

我有一个控制器方法如下

def create
  @game = Game.create_new_game(game_params)
  render 'show', status: 200
rescue StandardError => e
  render json: {
    status: 500,
    error: e.to_s
   }
end

我添加了一个binding.pry,我可以在我的控制台中清楚地看到以下错误:

#<ActiveRecord::RecordInvalid: Validation failed: Name can't be blank, Duration can't be blank>

但它仍然向客户端发送status:200。是否有不同的错误处理方式?

编辑:

create_new_game Game

中的方法
def self.create_new_game(prms)
  @player = Player.find(prms[:player].to_i)
  @game = @player.games.create!(
  name: prms[:name],
  duration: prms[:duration]
  )
  @game.save!
end

当记录无效时,ActiveRecord 通常不会引发异常。只有当您使用像 .create! 这样的 "bang" 方法时才会引发异常。我们也不可能知道Game.create_new_game里面发生了什么。这些用于例如种子文件中,开发人员应该知道验证失败,或者用于应该触发回滚的嵌套事务中。

但是你所做的并不是一个好的做法,因为异常应该用于异常事件——而不是正常的控制流。

相反,您应该检查 saving/updating 记录的 return 值并确定响应。

def create
  @game = Game.create(game_params)
  if @game.save
    status: :created, location: @game
    # or
    render json: @game
  else
    render json: {
      status: 500,
      error: @game.errors.full_messages
    }
  end
end