【问题标题】:How to resolve associated models dropdown menu prob in active admin如何解决活动管理员中的关联模型下拉菜单问题
【发布时间】:2023-03-15 06:22:01
【问题描述】:

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

我的管理员/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

结束

【问题讨论】:

  • 这些是字符串表示的实际对象。根据您构建此下拉列表的方式以及您使用的表单构建器,您将需要提供文本和值方法(:name,:id)或文本哈希值({name: :id})或关联数组([[:id:name]]) 一点代码可以帮助我们快速解决这个问题
  • validates :hostel,presence: true,inclusion:{in:%w(a b c h pg j frc e g i),message: "%{value} is not a valid hostel"} 我的模型有上述验证..
  • def create hostel = Hostel.find_by(hostel:resident_params[:hostel]) @resident = hostel.create_resident(resident_params) if hostel.present? if @user.save flash[:info] = "Resident Created" else flash[:info] = "Resident Creation Unsucessful" end end 这就是开始创建居民的方式..
  • 请确保您以后将此信息添加到您的问题而不是 cmets。
  • 好的..现在你能告诉我这里发生了什么...

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


【解决方案1】:

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

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

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

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

  1. 检查您的参数许可,并允许“hostel_id”

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

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

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

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

快乐编码,

亚辛。

【讨论】:

  • 我有两个模型:一个是 Resident,另一个是 Hostel 居民有属性:hostel、name 等。Hostel 有属性:hostel models/Resident.rb:belongs_to:hostel models/hostel.rb:has_many :residents 我在常驻控制器中有强大的参数方法,但我不允许其中的 hostel_id 来自 hostel 模型..
  • 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 ,:as =&gt; :check_boxes actions end end 这是我的表单使用活动管理员创建常驻对象的样子!
【解决方案2】:
class Hostel < ActiveRecord::Base
  def display_name
    name # or that code will return a representation of your Model instance
  end
end

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2018-09-23
    • 2019-08-25
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    相关资源
    最近更新 更多