2

検証が実行されないようにする「ドラフトとして保存」機能を備えた次のコードがあります(つまり、ステータスがドラフトでない場合にのみ実行する必要があります)。関連するモデルでこれを取得して、検証されないようにする方法がわかりません。

class Proposal < ActiveRecord::Base

  belongs_to :user
  has_one :primary_presenter, dependent: :destroy

  validates :title,               presence: true
  validates :primary_presenter,   presence: true, unless: :draft?
  validates :abstract,            presence: true, unless: :draft?
  validates :description,         presence: true, unless: :draft?

  accepts_nested_attributes_for :primary_presenter

  def draft?
    status.draft?
  end
end


class Presenter < ActiveRecord::Base
  belongs_to :proposal

  validates :email,           presence: true, unless: :proposal_is_draft?
  validates :first_name,      presence: true, unless: :proposal_is_draft?
  validates :last_name,       presence: true, unless: :proposal_is_draft?
  validates :title,           presence: true, unless: :proposal_is_draft?

  def proposal_is_draft?
    proposal.status.draft?
  end
end

class PrimaryPresenter < Presenter
end

もちろん問題は、レコードがまだ保存されていないときに presenter.proposal が nil であることです。ネストされた属性について reject_if: :all_blank を調べましたが、後で編集するときにレコードが存在するように、空白であってもレコードを作成したいので、それは私が望むことをまったくしていないようです. また、下書きとして保存する場合、部分的な提出を許可したいと考えています。何か案は?

4

2 に答える 2

1

これで十分かどうかはわかりませんが、1 つの可能性は、proposal が nil の場合、proposal_is_draft? を受け入れることです。事実上真です。その場合、次のように再定義できます。

def proposal_is_draft?
  !proposal.persisted? || proposal.draft?
end

これは見栄えがよくありませんが、提案が永続化されていない場合は true を返し、提案がドラフトの場合は true を返します (Proposal クラスで定義したメソッドを使用するように status.draft から変更されました)。

于 2013-08-15T23:11:01.577 に答える
0

個人的には ,を実際に使用することはありませんが、子モデルを直接検証する代わりに親モデルでaccepts_nested_attributes_for使用することに満足している場合は、標準モデルの検証を使用するのではなく、関連付けの「独自の」検証を試すことができます。reject_if

class Proposal < ActiveRecord::Base

  has_one :primary_presenter, dependent: destroy

  accepts_nested_attributes_for :primary_presenter,
    reject_if: primary_presenter_invalid?

  def primary_presenter_invalid?(attributes)
    return false if draft?
    [:email, :first_name, :last_name, :title].each do |attr|
      return true if attributes[attr].blank?
    end
    false
  end

end

Presenter次に、モデルの検証を削除すると思います。提案のネストされた属性以外の方法でプレゼンターを作成または更新する場合は、まだそれらが必要なように思えますか?

于 2013-08-15T23:32:43.167 に答える