Rails救援标准错误没有发送

时间:2018-04-12 15:41:10

标签: ruby-on-rails ruby-on-rails-4 error-handling standard-error

我有一个控制器方法如下

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

1 个答案:

答案 0 :(得分:3)

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

但是你所做的并不是一个好习惯,因为异常应该用于特殊事件 - 而不是正常的控制流程。

相反,您应该检查保存/更新记录的返回值并确定响应。

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