2017-08-09 98 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 

移除繼承時的第二個問題更爲複雜。通常情況下,當您想要驗證不從ActiveRecord::Base繼承的模型時,我建議只需include ActiveModel::Validations。但UniquenessValidator沒有在ActiveModel::Validations中定義,而是在ActiveRecord::Validations(有什麼意義)。這使得Clearance與不從ActiveRecord::Base繼承的模型不兼容。

我可能會定義一個虛擬的實施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