Может ли ребенок со многими родителями иметь разные аутентификации в зависимости от того, с кем он останется в эти выходные (Rails3) - PullRequest
0 голосов
/ 29 января 2012

У меня есть проект Rails 3.1 с многоуровневыми вложенными формами, которые используются повторно.

Например, у Учителя есть вложенное Существо.

class Teacher < ActiveRecord::Base
    has_one :being
    accepts_nested_attributes_for :being
end

Абитуриент также имеет вложенное Существо

class Entrant < ActiveRecord::Base
    has_one :being
    accepts_nested_attributes_for :being
end

Я хотел бы иметь возможность проверить дни рождения (в модели существа), но только если родитель существа является Абитуриентом.

В существующей модели:

attr_accessor :no_birthday
validates :birthday, :presence => {:message => 'Birthday is required to enter classes.'}, :unless => :no_birthday?

def no_birthday?
    unless self.no_birthday
        errors.add(:entrant, "Birthday is required.")
    end
end

В форме (только для учителей)

<%= hidden_field_tag 'no_birthday', "1" %>

И, на всякий случай, в teacher_controller:

def create
...
    @teacher = Teacher.new(params[:teacher])
    @teacher.being.no_birthday = 1
...
end

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

1 Ответ

0 голосов
/ 12 февраля 2012

Итак, несколько проблем с вышеуказанным подходом:

1) строка проверки. в то время как это выглядит так: если не должно быть реальной вещи, это не так. переформатировать как оператор if (в существующей модели):

validates :birthday, :presence => {:message => 'Birthday is required to enter classes.'}, :if => :birthday_needed?

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

def birthday_needed?
    birthday_needed
end
#checks for trueness of accessor named birthday_needed

2) Я могу решить проблему, установив средство доступа из необходимых контроллеров. Таким образом, контроллер одного из родителей установит для средства доступа значение true, а для другого - нет. Никаких странностей в скрытых полях формы или любых других случайных подходах, которые я искал:

контроллер создания родительского # 1, например:

def create
  ...
  @entrant.being.birthday_needed = true
end

у другого родителя просто не будет установлен этот метод доступа.

Конечно, мне нужно будет создать соответствующий метод доступа для существующей модели, иначе произойдет ошибка:

attr_accessor :birthday_needed

А теперь все работает. Учителям не нужны дни рождения, а абитуриентам нужны. Наконец оба родителя могут ужиться.

...