Применение исключения проверки при использовании state_machine

Я не смог найти точный способ выполнить исключение проверки на моей модели рельсов при использовании state_machine.

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

Моя модель содержит обычную проверку паролей

validates :password, length: {minimum: 6}
validates :password_confirmation, presence: true

Эта валидация важна, но при передаче моего пользователя из непроверенного в проверенное состояние я сталкиваюсь с проблемами с моей проверкой модели, поскольку я применяю обновление только к одному столбцу, но активная интеграция записей с state_machine, похоже, применяет обновление записи.

Фрагмент state_machine:

state_machine :initial => :unverified do

    event :verify do
      transition :unverified => :verified
    end

Таким образом, решение, похоже, применило бы исключение к валидации модели, я был привлечен к: если только в качестве решения ..

Я реализовал что-то, что я должен сказать, что не понял полностью, что, похоже, теперь приводит к удалению какой-либо проверки на пароле, что явно приводит к процессу работы state_machine, но не соответствует моей цели ..

мои изменения где добавить:

  validates :password, length: {minimum: 6}, :unless => :proc_no_password_validation
  validates :password_confirmation, presence: true, :unless => :proc_no_password_validation

и применять в частном методе:

def proc_no_password_validation
    Proc.new { |user| user.verify }
  end

У меня такое чувство, что я нахожусь на правильном пути, но помогу выявить мою ошибку или проблему или другое решение.

ОБНОВИТЬ Поэтому у меня была некоторая помощь от Jef, но я пришел к выводу, что маршрут исключения метода проверки модели был неправильным, я изменил свой код состояния следующим образом:

  state_machine :state, :initial => :unverified, :action => :bypass_validation do

    event :verify do
      transition :unverified => :verified
    end

    event :unverify do
      transition :verified => :unverified
    end
  end

а затем обход проверки на состояние, в котором меня интересует игнорирование

def bypass_validation
    if self.changes['state'][1] == 'verified'
      save!(:validate => false)
    else
      save!(:validate => true)
    end
  end
0
nl ja de

1 ответы

:unless accepts a method name as a symbol or a proc. You gave the name of a method that returns a Proc. As a Proc is not false, your unless condition is met and your validation skipped.

Вы должны использовать один из:

validates :password_confirmation, presence: true, :unless => :proc_no_password_validation
 def proc_no_password_validation
   self.verify
 end

validates :password_confirmation, presence: true, :unless => Proc.new{|user| user.verify}

<Сильный> UPDATE

state_machine позволяет обернуть ваши проверки в состояния:

state :unverified { # or :verified, when should validation apply ?
  validates :password ...
  validates :password_confirmation ...
}
1
добавлено
Просто, чтобы проверить, используете ли вы user.verify! ? Во-вторых, я не могу понять, почему проверка не выполняется: был ли пароль установлен на nil между проверенными и непроверенными состояниями? Вы можете проверить, вызван ли метод proc_no_password_validation при изменении состояния?
добавлено автор Jef, источник
Я думаю, вы должны попытаться удалить (по крайней мере, при тестировании SM) has_secure_password . В соответствии с документацией по API "Проверка наличия пароля, подтверждение пароля (с использованием атрибута «password_confirmation») автоматически добавляются ».
добавлено автор Jef, источник
Спасибо за быстрый ответ. Когда я применяю предлагаемые решения, которые вы упомянули, я, к сожалению, сталкиваюсь с обычной проблемой проверки: не могу перейти к состоянию через: verify from: notverified (Reason (s): State не может перейти через «проверка», пароль слишком короткий (минимум 6 символов )) .. Я считаю, что моя предыдущая попытка в основном просто удалила проверку полной остановки.
добавлено автор Andy, источник
Jef, переход происходит через код дайджеста для проверки подлинности электронной почты, который вызывает проверку события, когда валидатор валидирован. Честно говоря, рудиментарно. Проблема здесь в том, что я полагаюсь на мою проверку на другие изменения (обновить пароль и истекшие пароли), поэтому state_machine только служит для обновления состояния проверки конечным пользователем, я пошел по пути изменения привязки для использования state_machine для все проверки, но, похоже, много дополнительной работы, когда все, что я действительно хочу достичь, - это обновить 1 столбец для 1 пользователя, когда они подтвердили свою электронную почту и отслеживают это.
добавлено автор Andy, источник
Извините, мы публикуем здесь быстро. Я хочу, чтобы проверка пароля выполнялась для действий по созданию и обновлению для объекта пользователя, если вы это сделаете, поэтому я накладываю это на уровне модели для моего объекта пользователя. Проверка подлинности электронной почты помещается в пользовательскую модель для удобства, но поскольку меня интересует только изменение состояния проверки пользователей для электронной почты, я хочу, чтобы этот случай избегал проверки пароля, поскольку я не изменяю это значение
добавлено автор Andy, источник
Я использую user.verify без!. Я думаю, что проверка не выполняется, поскольку state_machine пытается выполнить обновление состояния столбца, но я предполагаю, что применяется обновление строки, а не обновление столбца, и поскольку столбцы паролей зашифрованы, проверка модели запутывается. Поэтому для меня есть два решения: либо пропустить проверку, либо найти способ убедиться, что обновление работает только с столбцом, но я не могу найти никаких намеков на это вокруг state_machine. Еще раз спасибо за потраченное время на помощь. Я вижу этот вопрос разными способами, но никто, кажется, не имеет правильного ответа.
добавлено автор Andy, источник
Я должен добавить здесь, что я использую has_secure_password, я не думаю, что это существенно меняет что-либо, но заметил, что я не упоминал об этом. Это означает, что нет двух записей пароля для проверки, поскольку я только обновляю состояние, что опять же указывает на необходимость пропустить этот шаг проверки.
добавлено автор Andy, источник
Я нашел решение, которое работает, но не подходит мне. Добавление инструкции: if к методу validates: password, length: {minimum: 6},: if =>: no_password_validation , а затем принятие исключения происходит только в том случае, если пользователь не подтвержден. < code> def no_password_validation self.state == 'unverified' end . Единственная проблема заключается в том, что новый пользователь находится в этом состоянии, поэтому, если пользователь пытается нарушить правило длины пароля, им удается создать созданную запись, но поскольку нет записи, проверка делает ошибку при вводе длины пароля. элегантный, но, по крайней мере, шаг вперед.
добавлено автор Andy, источник
В конце я нашел другое решение, вместо того, чтобы возиться с базовым валидацией, я применил действие по переходу в state_machine с выносом определенного метода, который при переходе от непроверенных к проверке игнорирует проверку (не требуется). state_machine: state,: initial =>: unverified,: action =>: bypass_validation do event: verify do transition: unverified =>: verified end , а затем def bypass_validation if self.changes [' state '] [1] ==' verified 'save! (: validate => false) else save! (: validate => true) end end
добавлено автор Andy, источник
pro.ruby
pro.ruby
1 181 участник(ов)

Язык программирования Ruby Additional docs: https://rubyreferences.github.io/rubyref/ Invite: https://telegram.me/joinchat/Be4rsT2NuB3CyJaF26j1kA Кто хочет компилировать: @crystal_ru (его синтаксис основан на Ruby) Участник @proDOT

Ruby, Rails, Hanami | dry-rb
Ruby, Rails, Hanami | dry-rb
1 180 участник(ов)

https://telegram.me/rubyjob - Ruby Job По вопросам - @eugene_shved

Ruby School .us
Ruby School .us
1 045 участник(ов)

Чат-болталка для учеников руби-школы и не только. Правила: https://telegra.ph/Pravila-chata-Rubi-shkoly-03-13

Random Ruby Chat
Random Ruby Chat
589 участник(ов)

Правила публикации вакансий: https://t.me/codenamecrud/60865

Rubyata
Rubyata
333 участник(ов)

Коммюнити Ruby и Ruby On Rails Флуд не приветствуются. Вакансии можно публиковать только и ТОЛЬКО по пятницам с хештегом #вакансия.

Ruby Talks
Ruby Talks
236 участник(ов)

Национальная Флеймотека

RubyRush
RubyRush
189 участник(ов)

rubyrush.ru программирование для самых новичков

Rails Chat
Rails Chat
87 участник(ов)

You are welcome to discuss Ruby On Rails development process and other stuff