如何解决活动管理员中的关联模型下拉菜单问题
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
我有两个型号:Hostel 和 Resident:
models/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('-')
之类的东西似乎更适合调试。
你的第二个问题是由以下两件事之一引起的:
检查你的参数是否允许,允许"hostel_id"
确保你的 <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
使用您希望在下拉列表中显示其值的列名称
我在活动管理员的下拉菜单中得到了不可读的值。
我有一个包含特定值(大约 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
我有两个型号:Hostel 和 Resident: models/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('-')
之类的东西似乎更适合调试。
你的第二个问题是由以下两件事之一引起的:
检查你的参数是否允许,允许"hostel_id"
确保你的
<select name="model[hostel_id]" >
而不是<select name="model[hostel]">
。这应该是自动完成的,如果不是,那可能是因为你没有在你的两个模型中很好地定义 linkhas_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
使用您希望在下拉列表中显示其值的列名称