Ruby Rails 嵌套属性未保存到数据库中?
Ruby on Rails nested attributes not saving into database?
我正在尝试在 "Todo list" 中创建项目列表,但是,我不确定我是否使用嵌套属性正确地执行此操作。我认为使用嵌套属性是正确的尝试,因为会有大量的项目列表,并且它将根据 ids 与正确的 "Todo list" 相关联。
tables 可能在填充记录时的样子的示例
待办事项table
id list
1 grocery shopping
2 health insurance
项目table
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
待办模型
class Todo < ActiveRecord::Base
belongs_to :user
has_many :items
accepts_nested_attributes_for :items
end
物品型号
class Item < ActiveRecord::Base
belongs_to :todo
end
待办事项视图
<%= simple_form_for(@todo) do |f| %>
<%= f.input :list %>
<%= f.simple_fields_for :items do |g| %>
<%= g.input :name %>
<% end%>
<%= f.button :submit %>
<% end %>
我可以让 name
字段显示在我的视图中,但是当我保存它时,它不会保存到数据库中,但是,我可以将列表保存到数据库,然后当我尝试编辑记录时,name
字段不再显示,无法编辑。
编辑:显示创建方法
这是我当前在 Todo Controller 中的创建方法
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: [ # you're missing this
:id,
:name
]
)
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
的 item_attributes。即,它类似于做
@todo.items.build
它已经创建了一个 todo_id
对应于 @todo.id
的项目
我正在尝试在 "Todo list" 中创建项目列表,但是,我不确定我是否使用嵌套属性正确地执行此操作。我认为使用嵌套属性是正确的尝试,因为会有大量的项目列表,并且它将根据 ids 与正确的 "Todo list" 相关联。
tables 可能在填充记录时的样子的示例
待办事项table
id list
1 grocery shopping
2 health insurance
项目table
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
待办模型
class Todo < ActiveRecord::Base
belongs_to :user
has_many :items
accepts_nested_attributes_for :items
end
物品型号
class Item < ActiveRecord::Base
belongs_to :todo
end
待办事项视图
<%= simple_form_for(@todo) do |f| %>
<%= f.input :list %>
<%= f.simple_fields_for :items do |g| %>
<%= g.input :name %>
<% end%>
<%= f.button :submit %>
<% end %>
我可以让 name
字段显示在我的视图中,但是当我保存它时,它不会保存到数据库中,但是,我可以将列表保存到数据库,然后当我尝试编辑记录时,name
字段不再显示,无法编辑。
编辑:显示创建方法
这是我当前在 Todo Controller 中的创建方法
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: [ # you're missing this
:id,
:name
]
)
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
的 item_attributes。即,它类似于做
@todo.items.build
它已经创建了一个 todo_id
对应于 @todo.id