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

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

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

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

Q&A

0回答

1180閲覧

Rails 2つのテーブルに同時追加したいがうまくいかない

ruby_0ct

総合スコア57

Ruby on Rails

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

0グッド

1クリップ

投稿2018/01/18 07:30

新しいブログ記事の投稿と同時に新しいカテゴリーを作成して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"=>"投稿する"}

###テーブル
ブログ本体テーブル

idblogtitleblogcategory_idcontent
1Apple Watch買ったよ1ブログの内容
2アメリカに行ってきた2ブログの内容

カテゴリーテーブル

idcategory
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

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問