Cocoon 显示对象而不是值

Cocoon Show object instead value

我的情况:

"app/models/aircraft.rb"

class Aircraft < ActiveRecord::Base
  has_many :aircraft_crew_roles
  has_many :crew_roles, through: :aircraft_crew_roles, class_name: 'CrewRole'
end

"app/models/aircraft_crew_role.rb"

aircraft_id
crew_role_id

class AircraftCrewRole < ActiveRecord::Base
  belongs_to :aircraft
  belongs_to :crew_role
  accepts_nested_attributes_for :crew_role, reject_if: :all_blank
end

"app/models/crew_role.rb"

name

class CrewRole < ActiveRecord::Base
end

"app/views/aircrafts/_form.html.haml"

= simple_form_for(@aircraft) do |f|
  = f.error_notification
  = f.input :name
  #crew
    = f.simple_fields_for :aircraft_crew_roles do |cr|
      = render 'aircrafts/aircraft_crew_role', :f => cr
    = link_to_add_association 'add a Crew Role', f, :aircraft_crew_roles, partial: "aircrafts/aircraft_crew_role"

  = f.button :submit

"app/views/aircrafts/_aircraft_crew_role.html.haml"

.nested-fields.crew-fields
  #crew_from_list
    = f.association :crew_role, as: :select, collection: CrewRole.all()
  = link_to_add_association 'or create a new Role', f, :crew_role
  = link_to_remove_association "remove Role", f

"app/views/aircrafts/_crew_role_fields.html.haml"

.nested-fields
  = f.input :role

这是我目前的情况,几乎一切正常:我可以向飞机添加新的机组人员,这将在 aircraft_crew_role 和 crew_role table 中创建相应的条目s,如果我连接到数据库,我可以看到所有条目都是正确的(我看到所有 ID 和 crew_role table 中的角色是我在表单中使用的那个)但是如果我尝试使用已经用以前的飞机保存的机组人员 select 填充对象而不是字符串:

#<CrewRole:0x007fa90d2f8df8>
#<CrewRole:0x007fa90d2f8c90>
#<CrewRole:0x007fa90d2f8b28>

我已经在应用程序的许多其他地方使用过 Cocoon,并且在所有其他地方都运行顺利。 我已经将我的代码与 cocoon repo 上的示例进行了比较,但我找不到问题所在

我完全不知道如何,但是 "simply" 删除并重新创建数据库,现在一切正常。

您正在使用 simple_form 的 f.association,它将尝试猜测如何呈现 CrewRole 对象。它寻找 namelabel 或普通旧 to_s ...在您的情况下它是一个非标准字段 role,因此它只会将模型转换为字符串(给出你得到的结果)。

要解决这个问题,您必须重命名您的列(有点过激,但也许这就是您在重新创建数据库时所做的?)或者更好的是,写类似

的内容
= f.association :crew_role, label_method: :role

有关详细信息,请参阅 simple_form documentation