Один из двух пользовательских методов проверки Active Record игнорируется даже при выполнении условия (Rails 5) - PullRequest
0 голосов
/ 04 июня 2019

В моей модели есть два пользовательских метода проверки ActiveRecord, которые должны запускаться одновременно. Однако, что бы я ни делал, выполняется только метод A (setup_ssh_user), но не B (save_ssh_on_server).

Я уже пробовал:

  • с использованием byebug и Rails.logger.info('funciton B is called') для проверки того, что метод B действительно никогда не вызывается
  • метод комментирования A
  • метод переименования B
  • с использованием validate вместо before_validation
  • обмен кодами методов A и B
class Postgresql < ApplicationRecord
  # Validations
  validates :host, presence: true
  validates :port, presence: true
  validates :user, presence: true
  validates :dbname, presence: true
  before_validation :setup_ssh_user, :save_ssh_on_server, on: :create, if: :ssh_tunnel?
  before_validation :save_ssh_on_server, on: :update, if: :ssh_public_key_changed?
  validate :rollback_ssh_setup, if: :rollback_needed

  # Associations
  has_one :target, as: :resource, inverse_of: :resource, autosave: true

  accepts_nested_attributes_for :target, reject_if: :all_blank, allow_destroy: true

  def rollback_needed
    return self.target.deleted || errors[:ssh_public_key].any? || errors[:ssh_user].any? ? true : false
  end

  def rollback_ssh_setup
    status1, status2, status3 = SshTunnel::Setup.new().rollback_ssh_setup(self.ssh_user, self.ssh_public_key)
    if status1.success? && status2.success? && status3.success?
      return true
    else
      errors.add(:ssh_tunnel, "Rollback of ssh setup failed.")
      return false
    end
  end

  def setup_ssh_user
    status = SshTunnel::Setup.new().create_user(self.ssh_user)
    if status.success?
      return true
    else
      errors.add(:ssh_user, "User Creation failed, please try again.")
      return false
    end
  end

  def save_ssh_on_server
    Rails.logger.info("ssh saving function called")
    status = SshTunnel::Setup.new().save_public_key(self.ssh_public_key, self.ssh_user)
    if status.success?
      return true
    else
      errors.add(:ssh_public_key, "Saving SSH Key failed, please try again.")
      return false
    end
  end
end

Поскольку оба метода очень похожи, я не понимаю, почему один из них никогда не выполняется, а другой - выполняется. Может быть, я неправильно понял, как работают проверки ActiveRecord? Буду очень благодарен за любые предложения по улучшению или отладке.

1 Ответ

0 голосов
/ 06 июня 2019

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

Я заменил:

before_validation :setup_ssh_user, :save_ssh_on_server, on: :create, if: :ssh_tunnel?

с:

  before_validation on: :create do
    if self.ssh_tunnel
      self.setup_ssh_user
      self.save_ssh_on_server
    end
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...