1

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

ответ

1

Там (немного устаревшие) драгоценные камни: rack-flash и sinatra-flash.

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

+0

[sinatra-flash] (https://github.com/SFEley/sinatra-flash) был тем, что я искал. и я получаю общую идею сейчас. Благодаря! – user3588841

Смежные вопросы