Вложенная форма в ActiveAdmin + Formtastic - PullRequest
0 голосов
/ 20 января 2019

Я хочу создать форму для создания 1 вопроса с 4 ответами.Я могу создать вопрос без проблем, но генерация вложенных ответов не работает.

Для этого я создал частичную (_newq.html.erb) загрузку через ActiveAdmin.

Контроллер вопросов:

permit_params :name,
              :explanation,
              :variant,
              :usage,
              :published,
              :topic_id,
              :context,
              choices_attributes: [:id, :name, :correct, :_destroy]

Частично _newq.html.erb:

<%= form_with(url: admin_questions_path, local: true, action: :create) do |f| %>
  <%= f.fields_for :question do |s| %>
    <%= s.label :name %>:
      <%= s.text_field :name %><br />
    <%= s.label :topic_id %>:
      <%= s.collection_select(:topic_id, Topic.all, :id, :exam_with_topic) %><br />
    <%= s.label :published %>:
      <%= s.check_box :published %><br />
    <%= s.label :context %>:
      <%= s.text_area :context %><br />
    <%= s.label :explanation %>:
      <%= s.text_area :explanation %><br />
    <%= s.label :variant %>:
      <%= s.select( :variant, ["Multiple Choice"]) %><br />
              <!--f.input :variant, :as => :select, :collection => ["fill", "Multiple Choice"], label: "Question Type"-->
    <%= s.label :usage %>:
      <%= s.select( :usage, ["Free Quiz"]) %><br />

    <%= s.fields_for :choices_attributes do |c| %>
      <%= c.label "Answer 1" %>:
        <%= c.text_field :name, :value => "answer test" %><br />
      <%= c.label "Correct?" %>:
        <%= c.check_box :correct %><br />
    <% end %>    


  <% end %>
  <%= f.submit %>
<% end %>

Если я удаляю раздел "choices_attributes", я могу создавать вопросыбез проблем, но попытка также создать вложенный выбор возвращает ошибку 500 с этим сообщением: TypeError (no implicit conversion of Symbol into Integer)

Я что-то упустил или это просто невозможно?

1 Ответ

0 голосов
/ 21 января 2019

Это возможно.Я предлагаю вам использовать dsl Active Admin для создания формы, см. https://activeadmin.info/5-forms.html#nested-resources (я перестал использовать .erb partials, даже для сильно настроенных форм).Убедитесь, что вы установили ассоциации между вашими моделями и добавьте accepts_nested_attributes, где это необходимо.

Ваше определение формы может выглядеть следующим образом.

form do |f|
  f.semantic_errors *f.object.errors[:base]
  inputs 'Question' do
    input :name
    input :explanation, :as => :text_area
    input :variant, :as => :select, :collection => Variant.for_html_select
    input :usage
    input :published
    input :topic, :as => select, :collection => Topic.all # make sure you put the has_many and belongs_to in your Question and Topic model
    input :context
  end
  inputs "Answers" do
    has_many :choices, allow_destroy: true do |c|
      c.input :name, :label => "Answer"
      c.input :correct, :label => "Correct?", :as => :boolean
  end
  actions
end

Не забудьте

class Question < ApplicationRecord
  has_many :choices
  accepts_nested_attributes_for :choices, :allow_destroy => true
  belongs_to :topic

и

class Choice < ApplicationRecord
  belongs_to :question

и

class Topic < ApplicationRecord
  has_many :questions

Чтобы ограничить ответы до 4, я бы добавил пользовательскую проверку в модель вопроса: и

class Question < ApplicationRecord
  validate :answer_check

  def answer_check
    errors.add(:base, "Needz 4 answerz") if choices.nil? || choices.length != 4
  end
end

и

class Variant < ApplicationRecord
  def self.for_html_select
    [
       ["Multiple Choice","fill"],
       ["Other variant","other"],
    ]
  end
end

Удачи!

...