2017-10-14 7 views
1

Faire une application de budget tout en apprenant à utiliser Ruby/Sinatra/SQL. Une partie de cela consiste à laisser l'utilisateur ajouter de nouveaux fournisseurs auxquels il peut assigner des transactions. Ma fonction d'ajout de transaction et d'ajout de fournisseur fonctionne, mais une chose que j'aimerais faire est de pouvoir lancer une erreur si le fournisseur que l'utilisateur essaie d'ajouter - par exemple 'Amazon' est déjà dans la base de données, avant de retourner à mon index des vendeurs.Comment dans Sinatra je vérifierais que le terme que l'utilisateur a entré dans un formulaire existe déjà dans votre base de données?

Le plus proche que je suis venu à obtenir quelque chose de travail est de rendre la colonne de nom de la table fournisseur UNIQUE. Mais si j'entre un nom qui existe déjà dans le champ, j'obtiens l'erreur "PG :: UniqueViolation".

Y a-t-il un moyen de dire à Sinatra que vous ne voulez pas que cette erreur soit signalée, vous voulez simplement rediriger vers l'index des fournisseurs sans la valeur répétée.

Mon formulaire de soumission de travail ressemble actuellement:

<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

En général, les gens utilisent un ORM pour gérer leurs validations de base de données. Il est également recommandé d'ajouter également des validations au niveau DB, mais l'utilisation d'un ORM facilite beaucoup les choses. [This] (https://code.tutsplus.com/tutorials/ruby-for-newbies-working-with-datamapper--net-19622) est un bon tutoriel pour utiliser [datamapper] (http://datamapper.org /getting-started.html) avec Sinatra - c'est un ORM qui, comme Sinatra, est intentionnellement simple à mettre en place. Vous pouvez également utiliser [activerecord] de Rails (http://guides.rubyonrails.org/active_record_basics.html) dans Sinatra sans trop de problèmes. –

+1

Les ORM ne résolvent pas tous vos problèmes, surtout si vous voulez apprendre le SQL. Datamapper est aussi un peu démodé ... Je recommanderais suite qui est la plus proche que vous pouvez obtenir dans Ruby quand il s'agit de SQL Ruby-like. – three

Répondre

2

commencer à utiliser cette erreur en réponse à travailler dans votre application. Vous pouvez ajouter un bloc begin/rescue/end à votre méthode:

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

Vous pouvez faire cette erreur de bloc spécifique, aussi. Il y a une bonne écriture sur la gestion des erreurs ruby ​​sur http://rubylearning.com/satishtalim/ruby_exceptions.html