首页 > 解决方案 > 关联导致 Active Admin 中的“EMPTY”

问题描述

所以我正在学习更多关于 Rails 中的 belongs_to 和 has_many 关联,并将它与 ActiveAdmin 结合起来。

我创建了一个模型“学期”和一个模型“场”。一个学期有很多领域,一个领域属于学期。

我的字段类看起来像这样:

class Field < ApplicationRecord
  belongs_to :semester
  accepts_nested_attributes_for :semester, allow_destroy: true
end

我的学期课程如下所示:

class Semester < ApplicationRecord
  has_many :fields
  accepts_nested_attributes_for :fields, allow_destroy: true
end

现在,我使用以下两个文件向活动管理员注册了模型:

ActiveAdmin.register Field do

  permit_params :name, semesters_attributes: [:name]

end

ActiveAdmin.register Semester do

  permit_params :name, :fields, fields_attributes: [ :field_id, :name]

end

现在有两个问题出现在我绝对无法摆脱的过程中:

1)如果我在尝试创建具有相应学期的新字段时收到错误消息“必须存在”后optional: true不添加。belongs_to :semester

2)如果我在能够创建一个新字段optional: true之后添加,但“学期”在新字段中将只是“空”。belongs_to :semester

案例 2) 的控制台输出将如下所示:

Started POST "/admin/fields" for 127.0.0.1 at 2018-08-17 15:23:54 +0200
Processing by Admin::FieldsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"+GPjjNPOv9GsjXnEtEjBcC0xUMHKKC+YpFLfiUFUOgsgBJ+pLCucscrN0YaTk551GFp4K5lBEI2RW1clw2vCWw==", "field"=>{"semester_id"=>"2", "name"=>"MAVT"}, "commit"=>"Create Field"}
  AdminUser Load (0.1ms)  SELECT  "admin_users".* FROM "admin_users" WHERE "admin_users"."id" = ? ORDER BY "admin_users"."id" ASC LIMIT ?  [["id", 1], ["LIMIT", 1]]
  ↳ /home/divepit/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.2.1/lib/active_record/log_subscriber.rb:98
Unpermitted parameter: :semester_id
   (0.0ms)  begin transaction
  ↳ /home/divepit/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.2.1/lib/active_record/log_subscriber.rb:98
  Field Create (0.6ms)  INSERT INTO "fields" ("name", "created_at", "updated_at") VALUES (?, ?, ?)  [["name", "MAVT"], ["created_at", "2018-08-17 13:23:54.026418"], ["updated_at", "2018-08-17 13:23:54.026418"]]
  ↳ /home/divepit/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.2.1/lib/active_record/log_subscriber.rb:98
   (12.2ms)  commit transaction
  ↳ /home/divepit/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.2.1/lib/active_record/log_subscriber.rb:98
Redirected to http://0.0.0.0:3000/admin/fields/22
Completed 302 Found in 22ms (ActiveRecord: 13.0ms)


Started GET "/admin/fields/22" for 127.0.0.1 at 2018-08-17 15:23:54 +0200
Processing by Admin::FieldsController#show as HTML
  Parameters: {"id"=>"22"}
  AdminUser Load (0.2ms)  SELECT  "admin_users".* FROM "admin_users" WHERE "admin_users"."id" = ? ORDER BY "admin_users"."id" ASC LIMIT ?  [["id", 1], ["LIMIT", 1]]
  ↳ /home/divepit/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.2.1/lib/active_record/log_subscriber.rb:98
  Field Load (0.1ms)  SELECT  "fields".* FROM "fields" WHERE "fields"."id" = ? LIMIT ?  [["id", 22], ["LIMIT", 1]]
  ↳ /home/divepit/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.2.1/lib/active_record/log_subscriber.rb:98
  Rendering /home/divepit/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activeadmin-1.3.1/app/views/active_admin/resource/show.html.arb
   (0.1ms)  SELECT COUNT(*) FROM "active_admin_comments" WHERE "active_admin_comments"."resource_type" = ? AND "active_admin_comments"."resource_id" = ? AND "active_admin_comments"."namespace" = ?  [["resource_type", "Field"], ["resource_id", 22], ["namespace", "admin"]]
  ↳ /home/divepit/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.2.1/lib/active_record/log_subscriber.rb:98
  ActiveAdmin::Comment Exists (0.1ms)  SELECT  1 AS one FROM "active_admin_comments" WHERE "active_admin_comments"."resource_type" = ? AND "active_admin_comments"."resource_id" = ? AND "active_admin_comments"."namespace" = ? LIMIT ? OFFSET ?  [["resource_type", "Field"], ["resource_id", 22], ["namespace", "admin"], ["LIMIT", 1], ["OFFSET", 0]]
  ↳ /home/divepit/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.2.1/lib/active_record/log_subscriber.rb:98
  Rendered /home/divepit/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activeadmin-1.3.1/app/views/active_admin/resource/show.html.arb (73.4ms)
Completed 200 OK in 77ms (Views: 74.9ms | ActiveRecord: 0.5ms)

提前感谢您提供有关如何解决此问题的任何提示!:)

标签: ruby-on-railsrubyactiveadminhas-manybelongs-to

解决方案


第一件事。你的联想是正确的,但根据你的联想,你不应该 field_id在学期表中。相反,您应该semester_id在字段表中。你也应该semesters_attributes改为semester_attributes

不允许的参数::semester_id

你应该允许semester_idfields_attributes

fields_attributes: [ :semester_id, :name]

最后,在 Rails 5 中,无论何时belongs_to定义关联,都需要默认存在关联的记录。为了避免这种默认行为,您需要添加optional: true


推荐阅读