我正在寻找问题的解决方案,但找不到根本原因。
我在Rails应用程序中有几个模型,其中两个Category
和Activity
具有多对多关系。在Category
和Activity
模型中,我都使用has_and_belongs_to_many
定义了这种关系。我在两者之间创建了一个联接表。请在这里找到我的数据库方案:https://pastebin.com/wc4TsPQQ。
用于创建新活动的表单包含一个字段,用于选择一个或多个要匹配的类别:
<%= f.collection_select :category_id, Category.all, :id, :name, {include_hidden: false}, {:multiple=>'true', :class=>'form-control'} %>
当我尝试提交表单时,activities.category_id
字段似乎未“注册”(不确定正确的术语)。 Rails要么抛出
"category cannot be blank"
错误,或者当我暂时禁用类别的状态验证时,该错误
SQLite3::ConstraintException: NOT NULL constraint failed: activities.category_id
但是,在请求参数中,类别ID是通过以下形式发送的:
{"authenticity_token"=>"MD5eM5H7DG6RkjD+/QSZ5RqkAnJupJ3L/V044r+QP6s0651mv4hoTSSa8NXB3x959dpwKsSQhBTi58idDMm9hA==",
"activity"=>{"name"=>"fsdffdf", "description"=>"sddfdsf", "location"=>"sdfsdf", "category_id"=>["3"], "user_id"=>"3"},
"commit"=>"Save Activity"}
答案 0 :(得分:1)
由于您要设置多个ID,因此您希望类别“ ID”不是“ ID”。
更改为console.log
,确保您也允许在控制器上使用该属性的数组。
答案 1 :(得分:1)
首先,您似乎创建了一个具有非null约束的activities.category_id
列,此处不需要。您可能想重新阅读“ The has_and_belongs_to_many
Association”文档。
要摆脱此列,您可以回滚并更改首先创建表的迁移,也可以创建删除列的迁移:
class RemoveCategoryIdFromActivities < ActiveRecord::Migration[6.0]
def change
remove_reference :activities, :category, index: true, foreign_key: true
end
end
还请删除belongs_to :category
模型中的Activity
关联,该关联会导致“类别不能为空”验证错误。
然后,您应该使用category_ids
而不是单数_id
。
<%= f.collection_select :category_ids, Category.all, :id, :name, {include_hidden: false}, {multiple: 'true', class: 'form-control' } %>
并确保将其正确列入白名单:
params.require(:activity)
.permit(:name, :description, :current_location, category_ids: [])