ブログ内容などを格納するブログ本体テーブルとカテゴリーテーブルの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対多」の関係です。
ブログ本体テーブル
id | blogtitle | blogcategory_id | content |
---|---|---|---|
1 | プリン作ってみた | 1 | ブログの内容 |
2 | おはよう | 2 | ブログの内容 |
カテゴリーテーブル
id | category |
---|---|
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
あなたの回答
tips
プレビュー