ruby-on-rails - Rails抢救标准错误未发送

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

我有一个 Controller 方法如下

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!之类的“爆炸”方法时,才会引发异常。我们也无法知道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

关于ruby-on-rails - Rails抢救标准错误未发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49800712/

相关文章:

ruby-on-rails - 如何使 Postgresql Hstore 在 ubuntu 上与 rails 4 一起工作

ruby-on-rails - Ruby 哈希 delete_if 很多

vb.net - 无法验证VB上的登录

ruby-on-rails - 带域名的本地Rails?

ruby-on-rails - 查找在一周中的特定日期创建的所有记录

ruby-on-rails - heroku 语言环境不工作 I18n::MissingTranslationData

c# - Visual C# 中用户定义的错误集合

mysql - I18n 和数据库 ActiveRecord 查询有什么关系?

ruby-on-rails - 对每个请求持续运行的这两个奇怪的查询是什么?

python-3.x - aiohttp api错误处理程序框架