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
我有一个控制器方法如下
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