经过一番研究后,我准备回答我自己的问题。
首先,我必须感谢@Lichtamberg 提出的修复建议。然而,这只会使事情变得复杂(也涉及安全性,尽管在本例中不是问题),并且不能帮助我实现理想的解决方案。
深入挖掘后,我发现这是 Rails 中非常常见的场景,实际上在瑞恩·贝茨 (Ryan Bates) 的截屏视频#17 http://railscasts.com/episodes/17-habtm-checkboxes.
因此,在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 中,因为它使用形式化 http://rdoc.info/github/justinfrench/formtastic,您可以使用此方法输出正确的字段(在本例中为复选框):
f.input :lifestyles, as: :check_boxes, collection: Lifestyle.all
另外,我简化了我的表单视图,所以现在只是这样:
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
好的,现在这在视图中完美呈现,但是如果我尝试提交更改,则会出现以下数据库错误:
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
属性。
有 2 个解决方案可以解决此问题:
- 要么将关联转换为 hm:t (
has_many, :through =>
)
- 或者从表中删除时间戳
我将选择 2),因为我永远不需要时间戳或任何额外的属性。
我希望这可以帮助其他遇到同样问题的人。
Edit:@cdesrosiers 最接近解决方案,但在阅读他的答案之前我已经写了这个答案。无论如何,这还是很棒的。我学到了很多。