Railsで異なるモデルも作成・編集できるフォームを作る

Rails: 5.2.1


fields_forを使うとひとつのフォームから複数のモデルを作成・編集することができます。

f:id:naito-coding0322:20181019185100p:plain モデルの構成は、Blog has_one Category

上記はBlogモデルの編集フォームですが、入力欄3つ目の「ブログのカテゴリー」を入力して変更ボタンを押すとCategoryモデルも編集することができます。

コントローラー

Blogコントローラーを以下のようにします。

def new
    @blog = Blog.new
    @category = Category.new
end

def create
    @blog = current_user.build_blog(blog_params)
    @category = @blog.build_category(category_params)
    redirect_to root_path if @blog.save && @category.save
end

def edit
    @blog = current_user.blog
    @category = @blog.category
end
  
def update
    @blog = current_user.blog
    @category = @blog.category
    @blog.update(blog_params)
    @category.update(category_params)
    redirect_to blog_path(@blog)
end

@categoryと、category用のストロングパラメータ(category_params)を用意します。
createアクションでは、@blogに紐付いたcategoryを作成するため@blog.build_categoryになります。

ビュー

<%= form_for(@blog) do |form| %>
  <%= form.text_field :title %>
  <%= fields_for(@category) do |category| %>
    <%= category.text_field :name %>
  <% end %>
  <%= form.submit "完了" %>
<% end %>

@blogのフォームにネストさせてfields_for(@category)を書きます。



便利で簡単ですね。


参考リンク

fields_for - リファレンス - - Railsドキュメント
Railsのfields_forで異なるモデルを編集するフォームを作成 | EasyRamble