如何通知用户Rails / Sinatra中的重复记录异常?

时间:2015-04-22 09:03:53

标签: ruby-on-rails activerecord sinatra sinatra-activerecord

我有一个Sinatra应用程序控制器,它在Survey表中创建一个新记录。这是我的ActiveRecord模型,用于验证title唯一性 -

class Survey < ActiveRecord::Base
  validates :title, uniqueness: true
  has_many :questions, dependent: :destroy
  belongs_to :user
end

最初,我只在我的控制器代码中使用Survey.create,但是当用户输入重复记录时,它会发现Rails,它将其标识为重复(由于验证),但随后选择该特定记录然后继续路由。我不希望这种情况发生。相反,我希望用户知道该记录存在,并且必须选择备用调查标题。这是我输入&#39; Beverages&#39;时最初的终端输出。 (重复记录) -

GET / survey / new   查询参数:{}   要求身体参数:{}

POST / survey / new   查询参数:{}   要求身体参数:{&#34; survey_title&#34; =&gt;&#34; Beverages&#34;}

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视图,然后将它们重新路由回页面。我希望用户知道标题存在,因此无法创建调查。我该怎么做呢?我应该提出异常吗?

1 个答案:

答案 0 :(得分:1)

那里(有点过时)宝石: rack-flashsinatra-flash

如果它们太旧而无法使用,你至少可以从那里窃取这个想法。