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
对象。它寻找 name
、label
或普通旧 to_s
...在您的情况下它是一个非标准字段 role
,因此它只会将模型转换为字符串(给出你得到的结果)。
要解决这个问题,您必须重命名您的列(有点过激,但也许这就是您在重新创建数据库时所做的?)或者更好的是,写类似
的内容
= f.association :crew_role, label_method: :role
有关详细信息,请参阅 simple_form documentation。
我的情况:
"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
对象。它寻找 name
、label
或普通旧 to_s
...在您的情况下它是一个非标准字段 role
,因此它只会将模型转换为字符串(给出你得到的结果)。
要解决这个问题,您必须重命名您的列(有点过激,但也许这就是您在重新创建数据库时所做的?)或者更好的是,写类似
的内容= f.association :crew_role, label_method: :role
有关详细信息,请参阅 simple_form documentation。