0

Sequelのモデルから発生する例外を処理する正しい方法は何ですか?特に私が遭遇しているのは、ログインに一意の制約が適用されている場合です。この場合の例外は、SequelではなくSQLite自体に起因しているように見えます。これは、「エラー」によって処理されていないことを意味します。

これは、「一意でない」ログインでユーザーを作成しようとした後に発生するエラーです。

Sequel::DatabaseError at /user/create
SQLite3::ConstraintException: column login is not unique
file: database.rb location: close line: 97

これが私の省略コードです:

require 'sinatra'
require 'sequel'

DB.create_table :users do
  primary_key :id
  String :login, :key => true, :length => (3..40), :required => true, :unique => true
  String :hashed_password, :required => true
  String :salt
  DateTime :created_at, :default => DateTime.now
end

class User < Sequel::Model
  # password authentication code
end

get '/user/create' do
  slim :user_create
end

post '/user/create' do
  user = User.new
  user.login = params['login']
  user.password = params['password']
  if user.save
    'User created'
  else
    tmp = []
    user.errors.each do |e|
      tmp << (e.join('<br/>'))
    end
    tmp
  end
end
4

3 に答える 3

1

おそらく、validation_helpersプラグインを使用validates_unique :loginし、validateメソッド内で使用することをお勧めします。

于 2012-06-30T15:43:09.153 に答える
0

sinatraの続編エラーを処理するには、以下のコードを追加してください。

sinatraのエラーブロックは、ルートの1つでスローされたエラーを処理します。これらのタイプのエラーのみを処理するために、最初の行でエラーのタイプを指定できます。

error Sequel::Error do
  e = env['sinatra.error']
  content_type :json
  status(400)
  return {
    message: e.message
  }.to_json
end

すべてのエラーを処理する場合は、次のコードブロックを挿入します。

error Exception do
  e = env['sinatra.error']
  content_type :json
  status(400)
  return {
    message: e.message
  }.to_json
end

これらのブロックの多くを組み合わせて、さまざまなタイプのエラーをさまざまに処理することができます。

于 2015-08-04T17:31:35.927 に答える
0

最初-検証プラグインを使用します

# models/account.rb
Sequel::Model.plugin :validation_helpers

class Account < Sequel::Model
  def validate
    super
     validates_unique :login
  end
end

次へ-アプリのエラーを処理します

# app.rb
... 
begin
  Account.create
rescue => e
  # do what you need
end
...
于 2018-04-14T09:12:59.727 に答える