Ruby on Rails嵌套属性没有保存到数据库中?

我正在尝试在“Todo列表”中创建项目列表,但是,我不确定我是否正确使用嵌套属性执行此操作。 我认为使用嵌套属性是正确的尝试,因为会有一个大的项目列表,并且它将与基于ids的正确“待办事项列表”相关联。

填充记录时表格的示例

待办事项表

id list 1 grocery shopping 2 health insurance 

物品表

 id todo_id name 1 1 buy milk 2 1 buy cereal 3 2 Blue Shield 4 2 Healthnet 5 1 buy cherries 

虽然我的尝试如下,但我的应用程序没有将任何数据保存到Item数据库中。

Todo控制器

 class TodoController < ApplicationController def new @todo = Todo.new @todo.items.build end end 

Todo模型

 class Todo < ActiveRecord::Base belongs_to :user has_many :items accepts_nested_attributes_for :items end 

项目模型

 class Item < ActiveRecord::Base belongs_to :todo end 

Todo View

        

我能够在我的视图中显示name字段,但是当我保存它时,它不会保存到数据库中,但是,我可以将列表保存到数据库中,然后当我尝试编辑时记录, name字段不再显示,以便能够编辑。


编辑:显示创建方法

这是我目前在Todo Controller中的Create方法

 def create @todo = Todo.new(todo_params) respond_to do |format| if @todo.save format.html { redirect_to @todo, notice: 'Todo was successfully created.' } format.json { render :show, status: :created, location: @todo } else format.html { render :new } format.json { render json: @todo.errors, status: :unprocessable_entity } end end end 

不确定Edit是否需要有东西,但我只是通过生成Todo的脚手架来实现这一点

 def edit end 

编辑2显示todo_params

 def todo_params params.require(:todo).permit(:user_id, :list) end 

您必须将嵌套参数添加到强参数中

 def todo_params params.require(:todo).permit(:user_id, :list, items_attributes: [:id, :text, ...]) end 

关于todo_id的注意事项:

您不需要在items_attributes列表中添加:todo_id ,因为您已将TODO作为上下文。

 @todo = Todo.new(todo_params) 

在上面的代码中,您的todo_params将包含一些链接到@todo 。 即,它与做的相似

 @todo.items.build 

它已经创建了一个todo_id@todo.id相对应的@todo.id

您需要将项目添加到列入白名单的属性列表中

 def todo_params params.require(:todo).permit( :user_id, :list, items_attributes: [ # you're missing this :id, :name ] ) end