新しいブログ記事の投稿と同時に新しいカテゴリーを作成してDBへ追加したいと思っています。
例えば、「MacBook Proのレビュー」という記事を投稿するとします。
それと同時に「PC」というカテゴリーを新規追加し、レビューの記事に紐付けて同時にDBへ登録したいのですが、 strong paramsが原因なのか投稿しようとすると Unpermitted parameter: blogcategories
とエラーが出てしまいます。
paramsでネストし2つのテーブルに同時格納する場合、下記のコードで問題ないと思うのですが、何が原因でうまくいかないのでしょうか?
テーブルは、ブログ内容などを格納するブログ本体テーブルとカテゴリーテーブルの2つがあり、カテゴリーテーブルのidを利用して紐付けています。
関係性は、ブログ本体テーブルからはカテゴリーに1つだけしか参照できず、カテゴリーからはいくつでも参照できる「1対多」の関係です。
params以下の通りで、カテゴリーに格納するデータはネストさせています。
Parameters: {"utf8"=>"✓", "authenticity_token"=>"省略", "blog"=>{"blogtitle"=>"ブログタイトル", "blogcategories"=>{"blogcategory_id"=>"99", "category"=>"新たなカテゴリー"}, "content"=>"ブログの内容"}, "commit"=>"投稿する"}
###テーブル
ブログ本体テーブル
id | blogtitle | blogcategory_id | content |
---|---|---|---|
1 | Apple Watch買ったよ | 1 | ブログの内容 |
2 | アメリカに行ってきた | 2 | ブログの内容 |
カテゴリーテーブル
id | category |
---|---|
1 | デバイス |
2 | 旅行 |
###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 params[:blog][:blogcategory_id] = category_maxid.to_s # 文字列型でparamsに取得したidを割り当て 10 @blog = Blog.new(blog_params) 11 12 if @blog.save 13 redirect_to blogs_url and return 14 else 15 redirect_to blogs_url and return 16 end 17 else 18 # エラー処理など 19 end 20 21private 22def blog_params 23 params.require(:blog).permit(:blogtitle, :content, blogcategories_attributes: [:blogcategory_id, :category]) 24end
###/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 5end
###/model/blog_category.rb
ruby
1class Blogcategory < ApplicationRecord 2 has_many :blogs 3 4 accepts_nested_attributes_for :blogs, allow_destroy: true 5end
あなたの回答
tips
プレビュー