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

时间:2016-04-01 13:24:43

标签: ruby-on-rails ruby activerecord activeadmin formtastic

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

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

我有两种模式:旅馆居民: 的 模型/ 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

结束

2 个答案:

答案 0 :(得分:3)

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

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

但是,如果通常存在,活动管理员足够聪明,可以使用“名称”行。这个方法的不好的一面是你的日志中的任何地方等它将使用该名称。如果表[self.id,self.name].join('-')的名称字段不唯一,那么hostels之类的内容似乎更适合调试。

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

  1. 检查你的params许可证,并允许“hostel_id”

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

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

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

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

    快乐编码,

    亚辛。

答案 1 :(得分:1)

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