【发布时间】:2011-01-14 19:25:14
【问题描述】:
我有一个嵌套表单
一个团队可以有多个会议,一个会议可以属于一个团队。 Crew 和 Meeting 都可以设置一个 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 sn-p(控制器):
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
【问题讨论】:
-
你为什么要复制gender_id?您可以使用以下命令返回会议中船员的性别 ID:meeting.crew.gender_id
-
更新了源代码,谢谢,但这并不能解决问题。当验证器运行时,record.crew 仍然是 Nil
-
我的意思是:为什么会议有自己的gender_id?为什么不只将其存储在 Crew 上?
-
因为gender_id 可以是MALE、FEMALE、NEUTRAL,所以我的工作人员可以有NEUTRAL 成员(MALE+FEMALE),但其中一些会议只能有MALE 成员,而其他会议可能只有FEMALE 成员.这是一个更合乎逻辑的问题,仍然没有解决问题
标签: ruby-on-rails validation forms activerecord nested-forms