У меня есть контроллер приложений Sinatra, который создает новую запись в таблице Survey
. Вот моя модель ActiveRecord, которая подтверждает title
уникальность -Как сообщить пользователю об исключении повторяющейся записи в Rails/Sinatra?
class Survey < ActiveRecord::Base
validates :title, uniqueness: true
has_many :questions, dependent: :destroy
belongs_to :user
end
Первоначально я использовал только Survey.create
в моем коде контроллера, но оказывается, Rails, когда пользователь вводит дубликат записи, он идентифицирует его как дубликат (из-за проверка), но затем выбирает эту конкретную запись, а затем продолжает маршрутизацию. Я не хочу, чтобы это произошло. Вместо этого я хотел, чтобы пользователь знал, что запись существует, и что нужно выбрать альтернативный заголовок. Вот терминальный вывод я должен был первоначально, когда я ввод 'Beverages' (дубликат записи) -
GET/обзоры/новый PARAMS Запроса: {} Requst PARAMS тела: {}
POST/обзоры/новый PARAMS запроса: {} Requst PARAMS тела: { "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 [email protected]
@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, а затем перенаправляя его обратно на страницу. Я хочу, чтобы пользователь знал, что название существует, и, следовательно, опрос не может быть создан. Как мне это сделать? Должен ли я возбуждать исключение?
[sinatra-flash] (https://github.com/SFEley/sinatra-flash) был тем, что я искал. и я получаю общую идею сейчас. Благодаря! – user3588841