2017-10-14 36 views
1

制作预算应用程序,同时学习使用Ruby/Sinatra/SQL。其中一部分涉及让用户添加他们可以分配交易的新供应商。我的添加事务和添加供应商函数都有效,但我想要做的一件事是,如果用户试图添加的供应商(例如,“亚马逊”)已经在数据库中,并且在返回之前能够抛出错误到我的供应商索引。如何在Sinatra中检查用户输入到表单中的术语是否已经存在于您的数据库中?

最近我得到的东西工作是使供应商表UNIQUE的名称列。但是,如果我输入的字段中已存在的名称,则会出现“PG :: UniqueViolation”错误。

有没有办法告诉西纳特拉你不想让这个错误出现,你只是想重定向回供应商的索引而没有重复的价值。

我的工作提交表单目前的样子:

<div id="new-transaction"> 
    <form action="/vendors/create" method="POST"> 

    <label for="name">New vendor name:</label> 
    <input type="text" name="name" id="vendorName" /> 

    <input type="submit" value="Add new vendor" id="btn-new-vendor"> 

    </form> 
</div> 
+1

通常人们使用ORM来处理他们的数据库验证。最好还要添加数据库级验证,但使用ORM使事情变得更容易。 [这](https://code.tutsplus.com/tutorials/ruby-for-newbies-working-with-datamapper-net-19622)是一个很好的教程,使用[datamapper](http://datamapper.org /getting-started.html)与Sinatra - 这是一个ORM,就像Sinatra一样,故意设置简单。您也可以在Sinatra中使用Rails的[activerecord](http://guides.rubyonrails.org/active_record_basics.html),而没有太多的麻烦。 –

+1

ORM不能解决所有问题,特别是如果您想学习SQL。 Datamapper也有点过时了......我推荐使用类似于Ruby的SQL时最接近Ruby的续集。 – three

回答

2

继续使用这个错误作为响应在您的应用程序一起工作。您可以在begin/rescue/end块添加到您的方法:

# some code before 
begin 
    DB.add_your_vendor_method 
rescue 
    go_back_to_index 
end 
show_value_to_user 
# some code after 

可以作出这样的误块特定的,太。有一些很好的红宝书错误处理写在http://rubylearning.com/satishtalim/ruby_exceptions.html

相关问题