Rails проверяет дочерний с родителем - PullRequest
1 голос
/ 14 января 2011

У меня есть вложенная форма

Экипаж может иметь много собраний, а встреча может принадлежать одной бригаде.Для членов экипажа и собрания можно установить атрибут sex_id.

Я хочу добавить ошибку в объект собрания, когда Crew.meeting_id! = Meeting.gender_id

Я написал простоеvalidator

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

Проблема в том, что при запуске этого валидатора переменная записи (наша модель Meeting) еще не связана с моделью Crew, поэтому я получаю сообщение об ошибке при вызове Nil.gender_id

Вот часть модели Meeting:

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

И мои команды # Создать фрагмент действия (контроллер):

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 голосов
/ 15 января 2011

Нашли обходной путь, в контроллере 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

Я сейчас, это не красиво, но работает, его можно делегировать модельному методу, но я хочу показать здесь рабочее решение. Вопрос до сих пор открыт ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...