我有一个嵌套的表单
船员可以举行多次会议,会议可以属于一个船员。 船员和会议都可以设置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
答案 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
我现在,它不漂亮,但它可以工作,它可以委托给模型方法,但我想在这里展示一个有效的解决方案。问题仍然存在......