如何通知用户 Rails/Sinatra 中的重复记录异常?
How do I inform a user about a duplicate record exception in Rails/Sinatra?
我有一个 Sinatra 应用程序控制器,它在 Survey
table 中创建了一条新记录。这是我的 ActiveRecord 模型,它验证 title
唯一性 -
class Survey < ActiveRecord::Base
validates :title, uniqueness: true
has_many :questions, dependent: :destroy
belongs_to :user
end
最初,我只在我的控制器代码中使用 Survey.create
,但结果是 Rails 当用户输入重复记录时,它会将其识别为重复(由于验证)但是随后选择该特定记录,然后继续路由。我不希望这发生。相反,我希望用户知道该记录存在并且必须选择另一个调查标题。这是我最初输入 'Beverages'(重复记录)时的终端输出 -
获取/surveys/new
查询参数:{}
请求 body 参数:{}
POST/surveys/new
查询参数:{}
请求 body 参数:{"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 视图,然后将它们重新路由回页面。我希望用户知道标题存在,因此无法创建调查。我该怎么做呢?我应该提出例外吗?
有(有点过时的)宝石:
rack-flash and sinatra-flash.
如果它们太旧而无法使用,您至少可以从那里借鉴想法。
我有一个 Sinatra 应用程序控制器,它在 Survey
table 中创建了一条新记录。这是我的 ActiveRecord 模型,它验证 title
唯一性 -
class Survey < ActiveRecord::Base
validates :title, uniqueness: true
has_many :questions, dependent: :destroy
belongs_to :user
end
最初,我只在我的控制器代码中使用 Survey.create
,但结果是 Rails 当用户输入重复记录时,它会将其识别为重复(由于验证)但是随后选择该特定记录,然后继续路由。我不希望这发生。相反,我希望用户知道该记录存在并且必须选择另一个调查标题。这是我最初输入 'Beverages'(重复记录)时的终端输出 -
获取/surveys/new 查询参数:{} 请求 body 参数:{}
POST/surveys/new 查询参数:{} 请求 body 参数:{"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 视图,然后将它们重新路由回页面。我希望用户知道标题存在,因此无法创建调查。我该怎么做呢?我应该提出例外吗?
有(有点过时的)宝石: rack-flash and sinatra-flash.
如果它们太旧而无法使用,您至少可以从那里借鉴想法。