2016-04-29 2 views
3

При попытке создать новую запись с has_one отношения (и все inverse_of правильно указано), форма отключена:Рельсы Администратор: has_one ассоциация формирует сломаны

enter image description here

Код для этой ассоциации следующим образом:

class Visit < ActiveRecord::Base 
    has_one :mri, dependent: :destroy, inverse_of: :visit 

    accepts_nested_attributes_for :mri, update_only: true 
    ... 
end 

class Mri < ActiveRecord::Base 
    belongs_to :visit, inverse_of: :mri, touch: true 
    ... 
end 

Когда я удалить всю строку с accepts_nested_attributes, я получаю недостающую форму, ничего:

No form at all.

Использование конфигурации rails_admin отключить вложенную форму, как последовать, дает тот же результат.

config.model Visit do 
    edit do 
    configure :mri do 
     nested_form false 
    end 
    end 
end 

ответ

3

Эти проблемы возникают из-за двух ошибок Rails Admin, IMO.

Полезно понять, что Rails Admin имеет два типа форм для ассоциации. Один из них классический (открывает окно для создания), а другой - это «nested_form», который отображает форму на странице. Параметр nested_form может быть изменен напрямую, как показано в вопросе выше, но с помощью Rails Admin автоматически устанавливается значение true для ассоциаций, включенных в accepts_nested_attributes_for.

Первая ошибка заключается в том, что accepts_nested_attributes_for: ..., update_only: true «интерпретируется» рельсами Admin как «Я не хочу давать параметры при создании». Эта интерпретация кажется wrong, так как поведение, которое изменяется в рельсах, касается исключительно обновлений объектов и не предотвращает передачу параметров вложенности при создании. Более того, я ожидал бы возврата к классической форме вместо полностью отключенной формы.

Быстрый и обычно вредный способ исправить это, чтобы изменить update_only по умолчанию false.

Вторая ошибка более удивительна, потому что «на вашем лице». Поскольку , классические (не вложенные) формы ассоциации для отношений has_one не получают инициализацию должным образом, если вы не укажете себе идентификаторы и геттеры. Таким образом, если у вас нет nested_attributes, вам необходимо включить линии как таковой в модели:

class Visit < ActiveRecord::Base 
    has_one :mri, dependent: :destroy, inverse_of: :visit 

    def mri_id 
    self.mri.try :id 
    end 

    def mri_id=(id) 
    self.mri = Mri.find_by_id(id) 
    end 

    ... 
end 

Наконец, используя наше понимание первой ошибки дала нам самое элегантное решение моей исходной задачи. Шаблоны администратора Rails source code показывают, что Rails Admin хранит параметр update_only для атрибута nested_form объекта поля. Мы можем непосредственно настроить его для того, чтобы достичь желаемого поведения (которое должно быть по умолчанию имо):

config.model Visit do 
    edit do 
    configure :mri do 
     nested_form[:update_only] = false 
    end 
    end 
end 

PS: Это сообщение является довольно долго, но это просто проблема в конечном итоге чеканка вниз кролика отверстие, так что я хотел поделиться своими выводами - надеюсь, это поможет. Огромное спасибо разработчикам RA, которые предоставляют Rails один из самых универсальных и многофункциональных админ-портала (когда-либо). Я открыл acouple вопросов о gh.

 Смежные вопросы

  • Нет связанных вопросов^_^