これまでに作った機能について簡単にまとめていく。
今回は、
子モデルの同時作成・更新
使用モデル
Blogモデル
カラム | データ型 | |
---|---|---|
1 | title | string |
2 | content | text |
Articleモデル(アソシエーションは記事中で追加)
カラム | データ型 | |
---|---|---|
1 | title | string |
2 | content | text |
3 | blog_id | bigint |
外部キーの追加
$ rails g migration AddBlogRefToArticles blog:references
アソシエーションの設定
app/models/blog.rb
class Blog < ActiveRecord::Base has_many :articles, dependent: :destroy end
app/models/article.rb
class Article < ActiveRecord::Base belongs_to :blog end
accepts_nested_attributes_forの設定
app/models/blog.rb
class Blog < ActiveRecord::Base has_many :articles accepts_nested_attributes_for :articles, allow_destroy: true end
コントローラーの設定
app/controllers/blogs_controller.rb
class BlogsController < ApplicationController def new @blog = Blog.new 1.times { @blog.articles.build } end def blog_params params.require(:blog).permit(:title, :text, article_attributes: %I(title content)) end end
articleのフォームを1つに設定
_attributesでarticleのパラメーターを設定
フォームの作成
app/views/blogs/_form.html.erb
<%= nested_form_for(blog) do |f| %> <div class=“blog_form"> <%= f.label :itle %> <%= f.text_field :title %> <%= f.label :content %> <%= f.text_field :content %> </div> <div class=“article_form"> <%= f.fields_for :articles do |article| %> <%= article.label :title %> <%= article.text_field :title %> <%= article.label :content %> <%= article.text_field :content %> <% end %> </div> <div class="action"> <%= f.submit %> </div> <% end %>
nested_form_forを使用
以上で作成完了