サーチ…


Ruby on Railsでネストされたフォームを設定する方法

最初に持っているもの:他のモデルとhas_manyリレーションを含むモデル。

class Project < ApplicationRecord
  has_many :todos
end

class Todo < ApplicationRecord
  belongs_to :project
end

ProjectsController

class ProjectsController < ApplicationController
  def new
    @project = Project.new
  end
end

ネストされたフォームでは、親オブジェクトを持つ子オブジェクトを同時に作成できます。

<%= nested_form_for @project do |f| %>
  <%= f.label :name %>
  <%= f.text_field :name %>

  <% # Now comes the part for `Todo` object %>
  <%= f.fields_for :todo do |todo_field| %>
    <%= todo_field.label :name %>
    <%= todo_field.text_field :name %>
  <% end %>
<% end %>

@projectProject.new @projectを初期化して、新しいProjectオブジェクトを作成するためのもの、 Todoオブジェクトを作成するためのものと同じようにする必要があるため、これを行う方法はいくつかあります。

  1. Projectscontrollerでは、 newメソッドで、 @todo = @project.todos.buildまたは@todo = @project.todos.newと書くことで、新しいTodoオブジェクトをインスタンス化できます。

  2. ビューでもこれを行うことができます: <%= f.fields_for :todos, @project.todos.build %>

強力なパラメータの場合、次のようにパラメータを含めることができます。

def project_params
  params.require(:project).permit(:name, todo_attributes: [:name])
end

Projectオブジェクトの作成によってTodoオブジェクトが作成されるため、 Projectモデルで以下の行を追加してこのことを指定する必要があります。

accepts_nested_attributes_for :todos


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow