activeadmin中的嵌套表单不保存更新

时间:2021-12-05 15:57:14

I have a nested form in ActiveAdmin for these models (a :class_section has_many :class_dates):

我在ActiveAdmin中为这些模型设置了一个嵌套表单(a:class_section has_many:class_dates):

class ClassDate < ActiveRecord::Base
  belongs_to :class_section
  validates :start_time, :presence => true
  validates :end_time, :presence => true

end

and

class ClassSection < ActiveRecord::Base
  belongs_to :class_course
  has_many :class_dates
  belongs_to :location

  accepts_nested_attributes_for :class_dates
end

Everything seems to be in the right place when I look at the form. However, when I update a class_date, it doesn't save.

当我看到表格时,一切似乎都在正确的位置。但是,当我更新class_date时,它不会保存。

ActiveAdmin.register ClassSection do

  permit_params :max_students, :min_students, :info, :class_course_id, :location_id

  form do |f|
    f.inputs "Details" do
      f.input :class_course, member_label: :id_num
      f.input :min_students, label: "Minunum Students"
      f.input :max_students, label: "Maxiumum Students"
      f.input :location
    end
    f.inputs do
      f.input :info, label: "Additional Information"
    end
    f.inputs "Dates" do
      f.has_many :class_dates, heading: false do |cd|
        cd.input :start_time, :as => :datetime_picker
        cd.input :end_time, :as => :datetime_picker
      end
    end
    f.actions
  end

  index do
    column :class_course
    column :location
    default_actions
  end

  filter :class_course
  filter :location

  show do |cs|
    attributes_table do
      row :class_course do
        cs.class_course.id_num + " - " + cs.class_course.name
      end
      row :location
      row :min_students, label: "Minunum Students"
      row :max_students, label: "Maxiumum Students"
      row :info, label: "Additional Information"
    end

    panel "Dates" do
      attributes_table_for class_section.class_dates do
        rows :start_time, :end_time
      end
    end
    active_admin_comments
  end 

end

Here is the ActiveAdmin file for ClassDates:

这是ClassDates的ActiveAdmin文件:

ActiveAdmin.register ClassDate, as: "Dates" do

  permit_params :start_time, :end_time, :class_section_id

  belongs_to :class_section

end

Can you see a reason why it's not saving properly?

你能看出为什么没有妥善保存的原因吗?

UPDATE: I added the following code to the AA and it seems to work now:

更新:我将以下代码添加到AA,它现在似乎工作:

controller do
  def permitted_params
    params.permit!
  end
end

Let me know if there is a better solution. Thanks.

如果有更好的解决方案,请告诉我。谢谢。

UPDATE 2: There is one lingering problem however. I am unable to delete ClassDates using this form.

更新2:然而,有一个挥之不去的问题。我无法使用此表单删除ClassDates。

1 个解决方案

#1


32  

You need to permit nested parameters, but you should never use params.permit!. It's extremely unsafe. Try this:

您需要允许嵌套参数,但绝不能使用params.permit!。这是非常不安全的。尝试这个:

ActiveAdmin.register ClassSection do
  permit_params :max_students, :min_students, :info, :class_course_id, :location_id, 
                class_dates_attributes: [ :id, :start_time, :end_time, :_destroy ]

  form do |f|
    # ...
    f.inputs "Dates" do
      f.has_many :class_dates, heading: false, allow_destroy: true do |cd|
        cd.input :start_time, :as => :datetime_picker
        cd.input :end_time, :as => :datetime_picker
      end
    end
    f.actions
  end

  # ...
end

The configuration (and permitted_params) of your ClassDate admin panel has nothing to do with the permitted parameters within the ClassSection admin panel. Treat them as separate controllers within the app.

ClassDate管理面板的配置(和allowed_pa​​rams)与ClassSection管理面板中的允许参数无关。在应用程序中将它们视为单独的控制器。

Adding the allow_destroy: true option to the has_many call will add a checkbox to the form to allow you to delete a class time upon form submission.

将allow_destroy:true选项添加到has_many调用将向表单添加一个复选框,以允许您在表单提交时删除课时。

#1


32  

You need to permit nested parameters, but you should never use params.permit!. It's extremely unsafe. Try this:

您需要允许嵌套参数,但绝不能使用params.permit!。这是非常不安全的。尝试这个:

ActiveAdmin.register ClassSection do
  permit_params :max_students, :min_students, :info, :class_course_id, :location_id, 
                class_dates_attributes: [ :id, :start_time, :end_time, :_destroy ]

  form do |f|
    # ...
    f.inputs "Dates" do
      f.has_many :class_dates, heading: false, allow_destroy: true do |cd|
        cd.input :start_time, :as => :datetime_picker
        cd.input :end_time, :as => :datetime_picker
      end
    end
    f.actions
  end

  # ...
end

The configuration (and permitted_params) of your ClassDate admin panel has nothing to do with the permitted parameters within the ClassSection admin panel. Treat them as separate controllers within the app.

ClassDate管理面板的配置(和allowed_pa​​rams)与ClassSection管理面板中的允许参数无关。在应用程序中将它们视为单独的控制器。

Adding the allow_destroy: true option to the has_many call will add a checkbox to the form to allow you to delete a class time upon form submission.

将allow_destroy:true选项添加到has_many调用将向表单添加一个复选框,以允许您在表单提交时删除课时。