Rails 5.1:devise_token_auth返回2错误,当只有1应该被发现

问题描述:

类似于this question为常规设计宝石,使用devise_token_auth宝石显示相同的结果 - 验证错误出现两次在json响应!?Rails 5.1:devise_token_auth返回2错误,当只有1应该被发现

从日志:

Processing by DeviseTokenAuth::RegistrationsController#create as JSON 
    Parameters: {"name"=>"Mickey Mouse", "email"=>"[email protected]", "password"=>"[FILTERED]", "confirmPassword"=>"[FILTERED]", "confirm_success_url"=>"http://localhost:4200/register", "registration"=>{"name"=>"Mickey Mouse", "email"=>"[email protected]", "password"=>"[FILTERED]", "confirmPassword"=>"[FILTERED]", "confirm_success_url"=>"http://localhost:4200/register"}} 
Unpermitted parameters: :confirmPassword, :confirm_success_url, :registration 
Unpermitted parameters: :confirmPassword, :confirm_success_url, :registration 
    (0.2ms) BEGIN 
    User Exists (0.9ms) SELECT 1 AS one FROM "users" WHERE "users"."email" = $1 LIMIT $2 [["email", "[email protected]"], ["LIMIT", 1]] 
    (0.8ms) SELECT COUNT(*) FROM "users" WHERE "users"."provider" = $1 AND "users"."email" = $2 [["provider", "email"], ["email", "[email protected]"]] 
    (0.3ms) ROLLBACK 
Completed 422 Unprocessable Entity in 247ms (Views: 0.7ms | ActiveRecord: 6.9ms) 

注意,unpermitted_pa​​rameters线显示两次 - 这似乎预示着什么奇怪的(这些线路不通过邮差显示)。

我的用户模型无关与标准引导多余的,所以我绝对不会对我的模型2次的独特性或存在验证,并检查宝石的源代码,也不会出现有。

这里是模型:

class User < ActiveRecord::Base 

    # Include default devise modules. 
    devise :database_authenticatable, :registerable, 
      :recoverable, :rememberable, :trackable, :validatable, 
      :confirmable, :omniauthable 
    include DeviseTokenAuth::Concerns::User 
end 

如果我把从邮差这个端点,我得到了相同的结果,这里是返回的JSON:

{ 
    "status": "error", 
    "data": { 
     "id": null, 
     "account_id": null, 
     "provider": "email", 
     "uid": "", 
     "name": null, 
     "nickname": null, 
     "image": null, 
     "email": "[email protected]", 
     "created_at": null, 
     "updated_at": null 
    }, 
    "errors": { 
     "email": [ 
      "has already been taken", 
      "has already been taken" 
     ], 
     "full_messages": [ 
      "Email has already been taken", 
      "Email has already been taken" 
     ] 
    } 
} 

Rails的API从Angular2称为使用angular2-token库,但这显然不是问题(从Postman得出结果)。

我怎么能要么找到这个原因,或者我怎么能猴子修补宝石取下第2次故障?

UPDATE

如果我从模型中取出:validatable,把我自己的验证:

validates_uniqueness_of :email 

我得到相同的结果,这是奇怪的。

+0

这不是理想的,但我已经采取调用'uniq'在使用它们之前在错误消息数组上。 – pdoherty926

+0

@ pdoherty926我很乐意这样做,除了这是在设计宝石之上构建的宝石,我不得不想办法从设计注册控制器通过做一些猴子补丁来访问它们善良(我从未做过) – rmcsharry

编辑:这个问题一直固定,只是升级宝石! > v0.1.43.beta1


我发现the issue报道在GitHub上。

的解决方法是删除:可验证(电子邮件独特仍将火),然后滚你自己的验证密码确认如图这一问题(见stephanebruckert有响应),并转载在这里:

引用: “validatable验证电子邮件和密码,这就是为什么我们不应该在模型中做任何这些,否则它将被验证两次。在我的情况下,只有电子邮件被验证两次,而我没有添加任何。在我的模型额外的检验所以我最终消除可验证并提出我自己的验证密码和password_confirmation:”

validates_presence_of :password, on: :create 
    validates :password, 
    length: { minimum: 8 }, 
    allow_blank: true 
    validate :password_complexity 
    validates_confirmation_of :password 
    validates_presence_of :password_confirmation, if: lambda {| u| u.password.present? } 

    private 

    def password_complexity 
     return unless password 
     if password.include?(username) || !password.match(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)./) 
     errors.add(:password, "Must include at least one lowercase letter, one uppercase letter and one digit") 
     end 
    end 

虽然这确实解决了重复的电子邮件错误,我现在得到一个“password_confirmation不能为空错误” ......一条通往一个兔子洞,发现this issue。您将需要阅读所有,但基本上,一个API应该强制执行密码确认值的存在(只在形式本身需要):)

+1

随意在答案中复制解决方法的内容! https://github.com/lynndylanhurley/devise_token_auth/issues/892#issuecomment-309425198 –

+0

@StéphaneBruckert好主意,完成:) – rmcsharry