模型无法保存

时间:2019-12-30 18:29:35

标签: ruby-on-rails ruby

我正在寻找问题的解决方案,但找不到根本原因。

我在Rails应用程序中有几个模型,其中两个CategoryActivity具有多对多关系。在CategoryActivity模型中,我都使用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"}

2 个答案:

答案 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: [])