Rails 5.1: devise_token_auth возвращает 2 ошибки, когда нужно найти только 1

Аналогично этому вопросу для обычного гема devise, использование гема devise_token_auth показывает тот же результат - ошибки проверки дважды появляются в ответе json!?

Из журнала:

Processing by DeviseTokenAuth::RegistrationsController#create as JSON
  Parameters: {"name"=>"Mickey Mouse", "email"=>"mickeymouse@gmail.com", "password"=>"[FILTERED]", "confirmPassword"=>"[FILTERED]", "confirm_success_url"=>"http://localhost:4200/register", "registration"=>{"name"=>"Mickey Mouse", "email"=>"mickeymouse@gmail.com", "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", "mickeymouse@gmail.com"], ["LIMIT", 1]]
   (0.8ms)  SELECT COUNT(*) FROM "users" WHERE "users"."provider" = $1 AND "users"."email" = $2  [["provider", "email"], ["email", "mickeymouse@gmail.com"]]
   (0.3ms)  ROLLBACK
Completed 422 Unprocessable Entity in 247ms (Views: 0.7ms | ActiveRecord: 6.9ms)

Обратите внимание, что строка unpermitted_parameters показана дважды - что, по-видимому, указывает на что-то странное (эти строки не отображаются через Postman).

Моя пользовательская модель не имеет ничего лишнего из стандартного руководства, поэтому у меня определенно нет двух проверок уникальности или присутствия на моей модели, и, изучая исходный код драгоценного камня, она также не обнаруживает этого.

Вот модель:

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": "mickeymouse@gmail.com",
        "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-ю ошибку?

ОБНОВИТЬ

Если я удалю :validatable из модели и поставить свою собственную проверку:

  validates_uniqueness_of :email

Я получаю тот же результат, что странно.

1 ответ

Решение

Изменить: Эта проблема была исправлена, просто обновите свой драгоценный камень! > v0.1.43.beta1


Я обнаружил, что проблема сообщается на GitHub.

Обходной путь должен удалить:validatable (уникальность электронной почты будет по-прежнему срабатывать), а затем выполнить собственную проверку для подтверждения пароля, как показано в этой проблеме (см. Ответ там stephanebruckert), и воспроизвести здесь:

Цитата: "validatable проверяет и электронную почту, и пароль, поэтому мы не должны делать ничего из этих моделей, в противном случае это будет проверено дважды. В моем случае, только электронная почта была проверена дважды, тогда как я не добавлял любая дополнительная проверка в моей модели. Поэтому я в итоге удалил 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 не может быть пустой ошибкой"... которое ведет к кроличьей норе, чтобы обнаружить эту проблему. Вам нужно будет прочитать все, но в основном API не должен обеспечивать наличие значения подтверждения пароля (требуется только в самой форме):)

Другие вопросы по тегам