如何解决活动管理员中的关联模型下拉菜单问题

How to resolve associated models dropdown menu prob in active admin

我在活动管理员的下拉菜单中得到了不可读的值。 我有一个包含特定值(大约 10 个值)的属性,但是当我使用活动管理员创建该 class 的新对象时...首先它显示不可读的下拉菜单 其次,即使我选择了一些不可读的值,它也会显示该属性为空。 请帮忙

我的admin/Resident.rb 页面::

ActiveAdmin.register Resident do
   permit_params :room_number,:roll_number,:name,:hostel,:hostel_id
   index do
    column :room_number
    column :roll_number
    column :name
    column :hostel
    actions
  end
  filter :name,:as => :string
  filter :hostel, :as => :select
  filter :room_number
  filter :roll_number

   form do |f|
     f.semantic_errors *f.object.errors.keys
     inputs 'Enter the student details' do
       input :room_number
       input :roll_number
       input :name
       input :hostel
       actions
     end
   end
end

我有两个型号:HostelResidentmodels/hostel.rb

class Hostel < ActiveRecord::Base
  has_many :residents
end

models/resident.rb

class Resident < ActiveRecord::Base

  belongs_to  :hostel
  validates :room_number,presence: true,uniqueness: {case_sensitive: false}
  validates :roll_number,presence: true,uniqueness:{case_sensitive: false}
  validates :name, presence: true,length:{ maximum: 50 }
  validates :hostel,presence: true

  def display_name
    hostel
  end

end

架构:: 居民

create_table "residents", force: :cascade do |t|
    t.string   "room_number"
    t.string   "roll_number"
    t.string   "name"
    t.string   "hostel"
    t.datetime "created_at",  null: false
    t.datetime "updated_at",  null: false
    t.integer  "hostel_id"
  end

宿舍:

create_table "hostels", force: :cascade do |t|
    t.string   "hostel"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false

结束

为了使文本可读,您可以重新实现 "to_s" 方法:

class Hostel < ActiveRecord::Base
  #... 
  def to_s
     self.name
  end
end

但是活跃的管理员足够聪明,可以使用通常存在的 "name" 行。这种方法不好的一面在你的日志等处无处不在。它会使用这个名字。如果 table hostels 的名称字段不是唯一的,那么 [self.id,self.name].join('-') 之类的东西似乎更适合调试。

你的第二个问题是由以下两件事之一引起的:

  1. 检查你的参数是否允许,允许"hostel_id"

  2. 确保你的 <select name="model[hostel_id]" > 而不是 <select name="model[hostel]">。这应该是自动完成的,如果不是,那可能是因为你没有在你的两个模型中很好地定义 link has_many / belongs_to

最后,最后一种方法是您仍然可以将自己的 collection 作为 f.input 的参数推送到活动管理员中:

  f.input :hostel_id, collection: Hostel.all.map{|x| [x.name, x.id]}

再来一次,这应该是自动完成的。在你的情况下它不是,所以仔细看看你的数据库模式。

快乐编码,

亚辛。

class Hostel < ActiveRecord::Base
  def display_name
    name # or that code will return a representation of your Model instance
  end
end

代替name使用您希望在下拉列表中显示其值的列名称