2013-08-15 2 views
2

У меня есть следующий код с функцией «сохранить как черновик», которая должна предотвращать запуск проверки (т. Е. Они должны запускаться только тогда, когда статус не является черновым). Я не знаю, как поднять на это в моих связанных моделей, чтобы сохранить их от проверяемого:Условные проверки Rails ActiveRecord для связанных моделей?

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 равна нулю, когда запись не была сохранена еще , Я посмотрел на reject_if:: all_blank для вложенных атрибутов, но это не похоже на то, что я хочу, так как я все еще хочу, чтобы запись была создана, даже если она пустая, так что при последующем редактировании запись будет существовать , Также я хочу разрешить частичные представления при сохранении в качестве черновика. Есть идеи?

+0

описание товара wow. очень отступ. – Gaston

ответ

1

Не уверен, что этого достаточно, но есть одна возможность принять, что когда предложение равно nil, offer_is_draft? это действительно так. В этом случае, вы можете переопределить его:

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

Хотя это выглядит не выглядит большим, он будет возвращать верно, когда предложение не сохраняется, и возвращает истину, когда предложение является проект (изменяется от состояния .draft использовать метод, который вы определили в классе Предложения).

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 модели. Хотя кажется, что вы все еще можете этого захотеть, если вы когда-либо создавали или обновляли презентаторов любым способом, кроме как через вложенные атрибуты предложений?

Смежные вопросы