質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

0回答

207閲覧

Rails 2つのテーブルに同時にレコード追加したいが、エラー

ruby_0ct

総合スコア57

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

1クリップ

投稿2018/01/12 07:23

ブログ内容などを格納するブログ本体テーブルカテゴリーテーブルの2つがあります。
ブログ記事の投稿と同時に新規カテゴリーを追加したいのですが、 Unpermitted parameter: blogcategories
と言われ、うまく同時にDBへ追加できません。

何が原因なのかご指摘いただければと思います。

paramsの中身は以下の通りで、カテゴリーテーブルに登録する内容は、ネストしています。

Parameters: {"utf8"=>"✓", "authenticity_token"=>"省略", "blog"=>{"blogtitle"=>"ブログタイトル", "blogcategories"=>{"blogcategory_id"=>"99", "category"=>"新たなカテゴリー"}, "content"=>"ブログの内容"}, "commit"=>"投稿する"}

カテゴリーを新規追加するときの流れとしては、
プルダウンで「カテゴリーを追加」を選び、jQueryでテキストフィールドを表示させてカテゴリー名を入力。
その後、controllerでparamsの内容によってif分岐させ、処理を行うという流れです。

###テーブル
2つのテーブルの関係は、ブログ本体テーブルからはカテゴリーに1つだけしか参照できず、カテゴリーからはいくつでも参照できる「1対多」の関係です。

ブログ本体テーブル

idblogtitleblogcategory_idcontent
1プリン作ってみた1ブログの内容
2おはよう2ブログの内容

カテゴリーテーブル

idcategory
1料理
2挨拶
99カテゴリーを追加する

プルダウンの一番下にカテゴリー追加を表示させたいので、idは99としています。

###blogs_controller.rb

Ruby

1 def new 2 @blog = Blog.new 3 @category = Blogcategory.new 4 5 @select_category = Blogcategory.all # プルダウンのカテゴリー表示 6 end 7 8def create 9 # idは順番に割り振りたいので、99以外の最大値を取得し、+1で順番にidを指定して割り当てます 10 category_maxid = Blogcategory.where.not(id: 99).maximum(:id) 11 category_maxid = category_maxid + 1 12 13 # paramsの中身によって新しくカテゴリーを追加する投稿かどうかifで判断します 14 # 今回は追加する場合のみのif文処理を書きます。 15 if params[:blog][:blogcategory_id] == '99' 16 # カテゴリーを新規追加する場合の処理 17 params[:blog][:blogcategory_id] = category_maxid.to_s # 文字列型でparamsに取得したidを割り当て 18 @blog = Blog.new(blog_params) 19 20 if @blog.save 21 puts('=======カテゴリー正常追加=======') 22 redirect_to blogs_url and return 23 else 24 puts('=======保存失敗=======') 25 redirect_to blogs_url and return 26 end 27 else 28 # エラー処理などは省きます。 29 end 30 31 @blog = Blog.new(blog_params) 32 33 if @blog.save 34 redirect_to blogs_url and return 35 else 36 redirect_to blogs_url and return 37 end 38end 39 40private 41def blog_params 42 params.require(:blog).permit(:blogtitle, :content, blogcategories_attributes: [:blogcategory_id, :category]) 43end

###/view/blogs/new.html.erb

ruby

1<%= form_for @blog do |f| %> 2 <p><%= f.text_field :blogtitle, placeholder: 'ブログタイトル', autocomplete: 'off' %></p> 3 4 <p><%= f.collection_select :blogegory_id, @select_category, :id, :category %></p> 5 6 <%= f.fields_for :blogcategories do |c| %> 7 <p><%= c.text_field :category, placeholder: 'カテゴリー名', autocomplete: 'off' %></p> 8 <% end %> 9 10 <%= f.text_area :content, rows: 8, placeholder: 'ブログの内容' %> 11 12 <div class="formsubmit"><%= f.submit '投稿する' %></div> 13 <% end %>

###/model/blog.rb

ruby

1class Blog < ApplicationRecord 2 belongs_to :blogcategory 3 4 attr_accessor :category # DBには存在しないカラムを追加。DBには登録しない 5end

###/model/blog_category.rb

ruby

1class Blogcategory < ApplicationRecord 2 has_many :blogs 3 4 accepts_nested_attributes_for :blogs, allow_destroy: true # 2つのフォームでDBに登録可能にする 5end

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gouf

2018/01/13 10:03

エラーの指摘通り、blogcategories を params の permit 一覧に加えた場合、何か変化は見られますか?
ruby_0ct

2018/01/14 07:55

params.require(:blog).permit(:blogtitle, :content, blogcategories_attributes: [:blogcategories, :blogcategory_id, :category]) とやってみましたが、Unpermitted parameter: :blogcategoriesと変わりませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問