Вы рассмотрели использование packrat ?
packrat::clean()
, например, удаляли неиспользуемые пакеты.
Прямой ответ заключается в том, чтобы спасти конкретное исключение, из которого вы хотите восстановить, а затем обработать его, как вы считаете нужным ... что-то вроде:
def create
@boo = current_user.my_boos.new(boo_params)
respond_to do |format|
begin
if @boo.save
format.html { redirect_to root_path, notice: "Thanks!" }
format.json { render :index, status: :created, location: @boo }
else
format.html { render :new }
format.json { render json: @boo.errors, status: :unprocessable_entity }
end
rescue PG::UniqueViolation
format.html { render :new }
format.json { render json: ["We've already got one"], status: :unprocessable_entity }
end
end
end
(спасение StandardError должно работать так же, как ну, но в то же время безопасный, он намного шире, чем нам нужно.)
Однако я бы предположил, что более «Railsy» решение должно определить валидацию уникальности в вашей модели, в дополнение к ограничению DB , поэтому он будет обрабатываться существующим if @boo.save
условным.
Вы можете добавить подтверждение к своей модели Boo, это предотвратит попытку сохранить недействительную запись и не будет необходимости спасать от ошибки PG :: UniqueViolation:
class Boo < ApplicationRecord
# ...
validates :name, uniqueness: { scope: :title }
# ...
end
( c) http://guides.rubyonrails.org/active_record_validations.html#uniqueness