Обратите внимание, что то, что вы делаете в контроллере или добавляете стандартную проверку уникальности в модель, вообще не позволяет создавать дубликаты продуктов.
Это будет продолжать отправлять пользователя обратно в форму:
def create
@product = Product.new(product_params)
if Product.exists?(product_code: @product.product_code)
render 'new'
flash[:error] = "This product already exists."
elsif @product.save
redirect_to @product
else
render 'new'
end
end
Если вы хотите просто предупредить пользователя, как только вы можете прикрепить виртуальный атрибут к модели и использовать его в качестве условия для проверки:
class Product < ApplicationRecord
attribute :dup_warning, :boolean, default: true
validate :lax_product_code_uniquenes
def lax_product_code_uniqueness
if new_record? && !dup_warning && Product.exists(product_code: self.product_code)
errors.add(:product_code, 'is not unique - are you sure?')
self.dup_warning = true
end
end
end
Затем добавьте виртуальный атрибут в форму:
<%= form_with(model: @product) do |f| %>
...
<%= f.hidden_input(:dup_warning) %>
...
<% end %>
И вам не нужно ничего делать в контроллере, кроме добавления dup_warning
в белый список параметров.
def create
@product = Product.new(product_params)
if @product.save
redirect_to @product
else
render 'new'
end
end
def product_params
params.require(:product)
.permit(:foo, :bar, :product_code, :dup_warning)
end