Как сообщить пользователю об исключении дублирования записи в Rails/Sinatra?

У меня есть контроллер приложения 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, а затем перенаправлять его обратно на страницу. Я хочу, чтобы пользователь знал, что заголовок существует и, следовательно, опрос не может быть создан. Как мне это сделать? Должен ли я вызвать исключение?


person user3588841    schedule 22.04.2015    source источник


Ответы (1)


Есть (немного устаревшие) гемы: rack-flash и sinatra-flash.

Если они слишком стары для использования, вы можете по крайней мере украсть идею оттуда.

person Andrey Deineko    schedule 22.04.2015
comment
Я искал sinatra-flash. и я получаю общее представление сейчас. Спасибо! - person user3588841; 22.04.2015