关联在Active Admin中导致“ EMPTY”

时间:2018-08-17 13:29:17

标签: ruby-on-rails ruby activeadmin has-many belongs-to

因此,我在Rails中学习了更多有关Emirates_to和has_many关联的信息,并将其与ActiveAdmin结合使用。

我创建了一个“学期”模型和一个“字段”模型。一个学期有多个字段,一个字段属于该学期。

我的字段类如下:

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

optional: true

现在在进行过程中出现了两个我绝对不能摆脱的问题:

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

2)如果我确实在belongs_to :semester之后添加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) ,则可以创建一个新字段,但在新字段中“学期”将只是“空”。

情况2)的控制台输出将如下所示:

super(this);  

在此先感谢您解决此问题的任何提示! :)

1 个答案:

答案 0 :(得分:1)

第一件事。您的关联是正确的,但是根据您的关联,您应该在学期表中没有 field_id。相反,您应该在字段表中使用semester_id。另外,您应该将semesters_attributes更改为semester_attributes

  

不允许的参数::semester_id

您应在semester_id中允许fields_attributes

fields_attributes: [ :semester_id, :name]

最后,在Rails 5中,每当定义belongs_to关联时,默认情况下都需要具有关联的记录。为了避免这种默认行为,您需要添加optional: true