2011-01-14 15 views
1

Ich habe ein verschachteltes FormularRails Validiere Kind mit Eltern

Eine Crew kann viele Meetings haben, ein Meeting kann zu einer Crew gehören. Eine Crew und ein Meeting können beide das Attribut gender_id gesetzt haben.

Ich möchte einen Fehler an das Meeting-Objekt hinzufügen, wenn Crew.meeting_id! = Meeting.gender_id

ich eine einfache Prüfung

class MeetingGenderValidator < ActiveModel::EachValidator 
    def validate_each(record, attribute, value) 
    if record.gender_id != record.crew.gender_id 
     msg = :wrong_gender 
     case record.crew.gender_id 
     when 1 then 
      msg = :crew_woman_only 
     when 2 then 
      msg = :crew_man_only 
     record.errors.add(attribute, msg, options) 
     end 
    end 
    end 
end 

Das Problem geschrieben habe, ist, wenn diese Prüfung durchgeführt wird, die Plattengröße (unser Meeting-Modell), ist noch nicht mit der Mannschaft Modell zugeordnet ist, so dass ich einen Fehler beim Aufruf Nil.gender_id

Hier ist der Teil des Modells Meeting:

Hier 210
class Meeting < ActiveRecord::Base 
    belongs_to :crew 
    validates :gender_id, :meeting_gender => true 
end 

ist der Teil der Besatzung Modells mit dem Verein:

class Crew < ActiveRecord::Base 
    has_many :meetings 
    accepts_nested_attributes_for :meetings 
end 

Und meine Crew # erstellen Aktion Schnipsel (Controller):

class CrewsController < ApplicationController 
    def create 
    @crew = Crew.new(params[:crew]) # here are the meeting params too 
    @crew.user = current_user # assigning the user from session/not important here 
    if @crew.save 
     ...... 
    end 
end 
+0

Warum du die gender_id an erster Stelle duplizierst? Sie können innerhalb eines Meetings zur gender_id der Crew zurückkehren: meeting.crew.gender_id –

+0

aktualisierte Quelle, thx, aber das löst das Problem nicht. Wenn der Validator ausgeführt wird, ist record.crew immer noch Nil – astropanic

+0

Ich meine eher: Warum hat Meeting seine eigene gender_id? Warum nicht einfach nur auf Crew speichern? –

Antwort

0

Haben Sie eine Abhilfe gefunden, in der Crew Controller :

def create 
    @crew = Crew.new(params[:crew]) 
    if @crew.meetings.to_a.size > 0 
    @meeting = @crew.meetings.first 
    @meeting.crew = @crew 
    @crew.meetings = [] 
    @crew.meetings << @meeting 
    end 
    @crew.user = current_user 
    .... 
end 

ich jetzt, es ist nicht schön, aber es funktioniert, kann es zu einem Modell Methode delegiert werden, aber ich will sh Hier eine funktionierende Lösung. Die Frage ist noch offen ...