0

タイプが「スケジュール済み」の場合にスケジュールが必要なモデルPersonがあります。そのコントローラー(から継承しInheritedResources::Baseます):

def create
  super do
    @person.schedule = Schedule.create params[:schedule] if @person.scheduled?
  end
end

問題は、「スケジュールされた」タイプのすべての人がスケジュールを持っていることを検証したいということです。このようなもの:

validates :schedule, :presence => true, :if => :scheduled?

Personモデルで。ただし、Personをスケジュールbelongs_toするため、自分自身を作成する前にPersonを作成する必要があります(そのため、PersonはIDを持ちます)。したがって、これが私のコントローラーにあると、スケジュールを後で作成する必要があるため、個人の検証は失敗します。

Railsに私が知らない何かがありますか?それは私がこれらの検証を実行することを可能にしますか?を使用accepts_nested_attributes_forした場合、これらの検証に合格できますか?

4

1 に答える 1

0

たぶん、事前に作成しないでください。

@person.schedule = Schedule.new params[:schedule] if @person.scheduled?

したがって、@person と割り当てられたスケジュールは同時に保存されます(トランザクション)。

これが唯一の正しい方法だと思います。


更新(super :create の概念による):

スーパーアクション

def create(&block)
  ...
  yield @person if block_given?
  @person.save # line where @person get saved
end

継承されたアクション

def create
  super do |person|
    person.schedule = Schedule.new params[:schedule] if person.scheduled?
  end
end
于 2012-12-30T07:16:37.057 に答える