0

在检查valid?具有validates_associated :contact, on: :create. 如果我打两个电话,valid?第一个是true,第二个是false

这是模型的最小版本,希望它足够详细:

class Parent < ActiveRecord::Base
  has_one :contact

  accepts_nest_attributes_for :contact

  validates_presence_of :contact
  validates_associated :contact, on: :create

  delegate :postcode,
           :phone_number,
           to: :contact
end

class Contact < ActiveRecord::Base
  belongs_to :parent
  belongs_to :country

  validates_format_of :phone_number, if: :logged_in_australian?, allow_blank: true
  validates_format_of :postcode, if: :logged_in_australian?, allow_blank: true

  private

  def logged_in_australian?
    logged_in? && australian?
  end

  def logged_in?
    current_user && current_user == user
  end

  def australian?
    country && country.name == 'Australia'
  end
end

我在控制器中看到的行为是两个动作之间的无限重定向:

  def dashboard
    flash.keep if !parent.valid?
    return redirect_to complete_signup_parent_path if !parent.valid?
    # other stuff
  end

  def complete_signup
    return redirect_to action: "dashboard" if parent.valid? #&& parent.valid?
    # other stuff
  end

如果我取消注释#&& parent.valid?它会停止重定向,这看起来很疯狂。

发生这种情况的父母有一个无效的phone_number,但他们注册后周围的要求发生了phone_number变化,所以我们不想为此烦恼他们。因此,期望的行为是valid?to be true,并且最初只是在随后的调用中发生变化。

我已经放入了一些调试语句,我可以看到验证上下文:update适用于每个调用。所以它不应该运行validates_associated. 这些也是创建的父母,所以不应该有:createor new_record?。另一个调试语句证明正在对联系人进行验证,包括对 phone_number 的验证,但仅在第二次在操作中被调用时。

我还设置了一个断点,可以看到parent.valid?返回 true 然后返回 false,而且如果我在valid?被调用和调用之前中断parent.contact_detail,然后parent.valid?它返回 false。

为什么第二次调用parent.valid?验证contact,即使它只应该这样做on: :create

4

1 回答 1

0

不用剩下的代码来判断,这很难。@parent 和 parent 是否指向同一个对象?

结果在#&& parent.valid?未注释时会有所不同,这使我认为@parent.valid? && parent.valid?!=@parent.valid?

于 2015-08-06T09:30:28.200 回答