我有一个 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/