Rails使用父级验证子级

时间:2011-01-14 19:25:15

标签: ruby-on-rails validation forms activerecord nested-forms

我有一个嵌套的表单

船员可以举行多次会议,会议可以属于一个船员。 船员和会议都可以设置gender_id属性。

我想在Crew.meeting_id!= Meeting.gender_id

时向Meeting对象添加错误

我写了一个简单的验证器

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

问题是,当运行此验证器时,记录变量(我们的会议模型)尚未与Crew模型关联,因此我在调用Nil.gender_id时出错

以下是会议模型的一部分:

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

以下是与协会有关的Crew模型的一部分:

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

我的工作人员#Create action snippet(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

1 个答案:

答案 0 :(得分:0)

在Crews控制器中找到了解决方法:

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

我现在,它不漂亮,但它可以工作,它可以委托给模型方法,但我想在这里展示一个有效的解决方案。问题仍然存在......