У меня есть контроллер приложения Sinatra, который создает новую запись в таблице Survey
. Вот моя модель ActiveRecord, которая проверяет уникальность title
:
class Survey < ActiveRecord::Base
validates :title, uniqueness: true
has_many :questions, dependent: :destroy
belongs_to :user
end
Первоначально я использовал только Survey.create
в своем коде контроллера, но оказалось, что когда пользователь вводит повторяющуюся запись, Rails идентифицирует ее как дубликат (из-за проверки), но затем выбирает эту конкретную запись и затем продолжает маршрутизацию. Я не хочу, чтобы это произошло. Вместо этого я хотел, чтобы пользователь знал, что запись существует и что необходимо выбрать альтернативное название опроса. Вот вывод терминала, который у меня был изначально, когда я вводил «Напитки» (дубликат записи) -
GET /surveys/new Параметры запроса: {} Параметры тела запроса: {}
POST /surveys/new Параметры запроса: {} Параметры тела запроса: {"survey_title"=>"Напитки"}
D, [--reda #1894] DEBUG -- : (1.6ms) BEGIN
D, [--redacted--- #1894] DEBUG -- : Survey Exists (12.2ms) SELECT 1 AS one FROM "surveys" WHERE "surveys"."title" = 'Beverages' LIMIT 1
D, [--redacted--- #1894] DEBUG -- : (0.7ms) ROLLBACK
Чтобы предотвратить это, теперь у меня есть этот код в моем контроллере (есть ли лучший способ сделать это?) -
post '/surveys/new' do
@survey = Survey.find_by(title: params[:survey_title])
if !@survey
@survey = Survey.create(title: params[:survey_title], user_id: session[:user_id].to_i)
else
# I want to add a message to the user here
redirect '/surveys/new'
end
session[:survey_id] = @survey.id
redirect to '/surveys/create'
end
Кроме того, в идеале я хотел бы отправить предупреждающее сообщение пользователю через Javascript без необходимости перенаправлять его в отдельное представление .erb, а затем перенаправлять его обратно на страницу. Я хочу, чтобы пользователь знал, что заголовок существует и, следовательно, опрос не может быть создан. Как мне это сделать? Должен ли я вызвать исключение?