2017-08-09 10 views
0

私はClearanceをAWS Dynamoとバックエンドストアとして連携させようとしています。私が抱えている問題は、ではなく、にクリアランスを得ることができないということです。これは、SQLクエリを介して標準ActiveRecord一意性検証を行うことができないため、行うことができません。クリアランスで電子メールの検証を無効にするには

the comments in the codeによると、私は私のUserオブジェクトリターンemail_optional?trueを持つことができるはず、それは電子メールの一意性の検証を無効にする必要があります。だから私は持っている:

class User < ApplicationRecord 
    include Dynamoid::Document 
    include Clearance::User 

    field :name 
    field :email 

    def email_optional? 
    puts 'yes, email is optional' 
    true 
    end 
end 

しかし、私は、ユーザー、私はエラーを取得し、かつ、ポイントへの多くを作成しようとすると、putsが実行されていません。

$ rails c 
Running via Spring preloader in process 18665 
Loading development environment (Rails 5.1.3) 
irb(main):001:0> u = User.new(name: 'ijd', email: '[email protected]', password: 'test') 
ActiveRecord::StatementInvalid: Could not find table 'editor_development_users' 
    from (irb):1 

更新:からの応答を@spickermannは、ActiveRecord::Baseをサブクラス化せずに(ApplicationRecordを介して)試みたことに気づくべきであることを私に思い出させました。それは別のエラーを与える:

class User 
    include Dynamoid::Document 
    .... 
irb(main):002:0> reload! 
Reloading... 
=> true 
irb(main):003:0> u = User.new(name: 'ijd', email: '[email protected]', password: 'test') 
ArgumentError: Unknown validator: 'UniquenessValidator' 
    from app/models/user.rb:4:in `include' 
    from app/models/user.rb:4:in `<class:User>' 
    from app/models/user.rb:2:in `<top (required)>' 
    from (irb):3 

答えて

1

User.newはバリデーションをトリガしません。したがって、エラーは検証自体に接続することはできません。

現時点では、あなたのUserモデルは、両方の一種である:ActiveRecord::Baseのサブクラスであり、それはDynamoid::Documentのように振る舞います。

class User < ApplicationRecord 
    include Dynamoid::Document 

    # ... 
end 

ActiveRecord::Baseインスタンスが初期化されるときにデータベースからテーブル定義を読み取ります。これは、テーブルが存在しないため、例外につながります。 ApplicationRecordから継承を削除するだけです。

class User 
    include Dynamoid::Document 

    # ... 
end 

継承を削除するときの第2の問題は、より複雑です。通常、ActiveRecord::Baseから継承しないモデルを検証する場合は、ちょうどinclude ActiveModel::Validationsにすることをお勧めします。しかし、UniquenessValidatorActiveModel::Validationsでは定義されていませんが、ActiveRecord::Validations(何が理にかなっています)に定義されています。これにより、ActiveRecord::Baseを継承しないモデルとの互換性がなくなります。Clearance

私はおそらく回避策としてUniquenessValidatorのダミー実装を定義しますご返信用

class User 
    include Dynamoid::Document 

    class UniquenessValidator 
    def initialize(_options); end 
    def def validate_each(_record, _attribute, _value); end 
    end 

    # ... 
end 
+0

感謝を。私は元の返信で既にそれを試したことを言及していたはずですが、別のエラーが発生します。上記の投稿を更新しました。 –

+0

@IanDickinson TIL 'UniquenessValidator'は 'ActiveModel :: Validations'の一部ではありません。更新された質問の問題に対処するために私の答えを更新しました。 – spickermann

関連する問題