Ruby on Rails的嵌套属性无法保存到数据库?(Ruby on Rails nested a

2019-10-23 21:04发布

我想要一个“待办事项列表”的中创建的项目清单,但是,我不知道如果我有嵌套属性正确地这样做。 我想用一个嵌套的属性是因为那里将是项目的大名单的权利的尝试,它将基于ID的正确的“待办事项列表”的关联。

的表格看起来可能会被填充记录时像例

一切都表

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数据库。

所有控制器

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字段显示不出来了才能够进行编辑。


编辑:显示创建方法

这是我目前在待办事项控制器创建方法

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

不知道如果编辑需要有一些东西,但我只有这个距离产生的Todo的支架

def edit
end

编辑2个显示todo_params

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

Answer 1:

您必须嵌套PARAMS添加到您的强PARAMS

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

备注 todo_id:

你并不需要添加:todo_iditems_attributes列表,因为你已经有了TODO为背景。

@todo = Todo.new(todo_params)

在上面的代码,你todo_params将包含与一些item_attributes @todo 。 即,它类似于做

@todo.items.build

它将已经与创建项目todo_id对应@todo.id



Answer 2:

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

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


文章来源: Ruby on Rails nested attributes not saving into database?