2011-01-14 148 views
1

我有一個嵌套的表格Rails的驗證孩子與父母

船員可以有很多的會議,會議可以屬於一個船員。 一個船員和一個會議都可以設置gender_id屬性。

我想一個錯誤添加到會議對象時Crew.meeting_id!= Meeting.gender_id

我寫了一個簡單的校驗

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 

的問題是,當運行這個驗證,記錄變量(我們的會議模式),還沒有跟劇組模型相關聯,所以我得到關於調用Nil.gender_id

這裏的錯誤是會議模式的一部分:

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

這裏是船員模型與協會部分:

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

我的船員#創建動作片段(控制器):

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

爲什麼你首先複製了gender_id?您可以通過以下方式在會議中找到Crew的gender_id:meeting.crew.gender_id – 2011-01-14 19:34:32

回答

0

已經找到了解決辦法,在船員控制器:

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 

我現在,它不漂亮,但它的工作原理,它可以委託給一個模型方法,但我想sh在這裏工作的解決方案。問題仍然存在......