2015-04-22 20 views
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當用戶輸入一個重複的記錄,它識別爲重複的(因驗證),但然後選擇該特定記錄,然後繼續路由。我不希望發生這種情況。相反,我希望用戶知道該記錄存在,並且必須選擇替代調查標題。這裏是終端輸出I最初曾當I輸入 '飲料'(重複記錄) -

GET /調查/新 查詢參數:{} Requst體PARAMS:{}

POST /調查/新 查詢參數:{} 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-flashsinatra-flash

如果它們太舊以至於無法使用,那麼您至少可以從那裏竊取您的想法。

+0

[sinatra-flash](https://github.com/SFEley/sinatra-flash)是我一直在尋找的。我現在得到了一般想法。謝謝! – user3588841