gpt4 book ai didi

ruby-on-rails - has_and_belongs_to_many 关系的自定义 Active Admin 表单输入

转载 作者:行者123 更新时间:2023-12-04 16:26:15 24 4
gpt4 key购买 nike

我有一个非常简单的模型

class Lifestyle < ActiveRecord::Base
attr_accessible :name
has_and_belongs_to_many :profiles
end

有一个 has_and_belongs_to_manyProfile 的关系
class Profile < ActiveRecord::Base
attr_accessible ...

belongs_to :occupation

has_and_belongs_to_many :lifestyles
accepts_nested_attributes_for :lifestyles
end

我想使用 ActiveAdmin 来编辑配置文件对象,但还要将生活方式分配给配置文件。应该类似于处理 belongs_to :occupation ,因为这是由 ActiveAdmin 自动整理到一个带有可用职业的选项的下拉框。

我试过使用 has_many表单构建器方法,但这只是让我显示一个表单以输入生活方式的名称,并在提交时返回一个错误。
    f.object.lifestyles.build
f.has_many :lifestyles do |l|
l.input :name
end

我得到的错误:
Can't mass-assign protected attributes: lifestyles_attributes

对我来说最完美的方法是建立几个复选框 ,数据库中的每种生活方式一个。选中意味着生活方式已连接到配置文件,未选中意味着删除关系。

我非常怀疑这是否可以使用 ActiveAdmin 而不必创建非常复杂的逻辑来处理这个问题。 如果您能提出您的意见并建议我是否应该走这条路或以不同的方式处理它,我将不胜感激。

最佳答案

经过一番研究,我准备回答我自己的问题。

首先,我必须感谢@Lichtamberg 提出修复建议。但是,这只会使事情复杂化(也涉及安全性,尽管在这种情况下不是问题),并且无法帮助我找到理想的解决方案。

深入挖掘,发现这是Rails中很常见的场景,其实在Ryan Bates' screencast no #17中都有解释。 .

因此,在 Rails 中,如果你有一个 has_and_belongs_to_many(简称 HABTM)关联,你可以通过这个方法轻松设置其他关联对象的 id:

profile.lifestyle_ids = [1,2]

如果您为lifestyle_ids设置了attr_accessible,这显然适用于表单:
class Profile < ActiveRecord::Base
attr_accessible :lifestyle_ids
end

在 ActiveAdmin 中,因为它使用 Formtastic ,您可以使用此方法输出正确的字段(在本例中为复选框):
f.input :lifestyles, as: :check_boxes, collection: Lifestyle.all

另外,我简化了我的表单 View ,所以现在只是这样:
  form do |f|
f.inputs # Include the default inputs
f.inputs "Lifestlyes" do # Make a panel that holds inputs for lifestyles
f.input :lifestyles, as: :check_boxes, collection: Lifestyle.all # Use formtastic to output my collection of checkboxes
end
f.actions # Include the default actions
end

好的,现在这在 View 中完美呈现,但是如果我尝试提交我的更改,它会给我这个数据库错误:
PG::Error: ERROR:  null value in column "created_at" violates not-null constraint
: INSERT INTO "lifestyles_profiles" ("profile_id", "lifestyle_id") VALUES (2, 1) RETURNING "id"

我发现这是因为 Rails 3.2 不会自动更新 HABTM 关联表的时间戳(因为它们是额外的属性,而 Rails 只处理 _id 属性。

有两种解决方案可以解决此问题:
  • 要么将关联转换为 hm:t ( has_many, :through => )
  • 或者从表中删除时间戳

  • 我将选择 2),因为我永远不需要时间戳或任何额外的属性。

    我希望这可以帮助其他有同样问题的人。

    编辑: @cdesrosiers 最接近解决方案,但在我阅读他的答案之前我已经写了这个答案。无论如何,这还是很棒的。我正在学习很多东西。

    关于ruby-on-rails - has_and_belongs_to_many 关系的自定义 Active Admin 表单输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13130809/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com