ฉันจะแจ้งให้ผู้ใช้ทราบเกี่ยวกับข้อยกเว้นบันทึกซ้ำใน 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 /แบบสำรวจ/พารามิเตอร์แบบสอบถามใหม่: {} ต้องการพารามิเตอร์เนื้อหา: {}

POST /แบบสำรวจ/พารามิเตอร์การค้นหาใหม่: {} ต้องการพารามิเตอร์เนื้อหา: {"survey_title"=>"Beverages"}

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