【问题标题】:Nested form in activeadmin not saving updatesactiveadmin 中的嵌套表单不保存更新
【发布时间】:2014-01-28 15:37:48
【问题描述】:

我在 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

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

  accepts_nested_attributes_for :class_dates
end

当我查看表格时,一切似乎都在正确的位置。但是,当我更新 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

这是 ClassDates 的 ActiveAdmin 文件:

ActiveAdmin.register ClassDate, as: "Dates" do

  permit_params :start_time, :end_time, :class_section_id

  belongs_to :class_section

end

你能看出它没有正确保存的原因吗?

更新:我在 AA 中添加了以下代码,它现在似乎可以工作了:

controller do
  def permitted_params
    params.permit!
  end
end

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

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

【问题讨论】:

  • 你不应该允许嵌套的参数被移交吗?
  • 我添加了一些代码来做到这一点,它似乎工作。 (我会更新)
  • 除了提供删除 ClassDate 记录的方法外,它的工作原理。

标签: ruby-on-rails forms ruby-on-rails-4 activeadmin formtastic


【解决方案1】:

您需要允许嵌套参数,但您应该从不使用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

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

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

【讨论】:

  • 感谢您的回答。这很有帮助。对权限的更改有效。 'allow_destroy: true' 确实给了我复选框,但它似乎不起作用。我选中该框并单击“更新课程部分”,class_date 仍然存在。
  • 您的日志中是否有任何关于未经许可的参数的消息?您需要将:_destroy 包含在class_dates_attributes 数组中,并将accepts_nested_attributes_for :class_dates, allow_destroy: true 包含在ClassSection 模型中。
  • 在 ClassSection 模型中添加“allow_destroy: true”就可以了。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多