【问题标题】:Rails Validate child with parentRails 验证孩子与父母
【发布时间】: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


【解决方案1】:

在 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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多