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

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

ただいまの
回答率

91.03%

  • Ruby on Rails

    6178questions

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

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

受付中

回答 0

投稿

  • 評価
  • クリップ 1
  • VIEW 62

ruby_0ct

score 21

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

  def new
    @blog = Blog.new
    @category = Blogcategory.new

    @select_category = Blogcategory.all # プルダウンのカテゴリー表示    
  end

def create
      params[:blog][:blogcategory_id] = category_maxid.to_s # 文字列型でparamsに取得したidを割り当て
      @blog = Blog.new(blog_params)

      if @blog.save
          redirect_to blogs_url and return
        else
          redirect_to blogs_url and return
        end
    else
      # エラー処理など
    end

private
def blog_params
      params.require(:blog).permit(:blogtitle, :content, blogcategories_attributes: [:blogcategory_id, :category])
end

/view/blogs/new.html.erb

<%= form_for @blog do |f| %>
      <p><%= f.text_field :blogtitle, placeholder: 'ブログタイトル', autocomplete: 'off' %></p>

      <p><%= f.collection_select :blogegory_id, @select_category, :id, :category %></p>

      <%= f.fields_for :blogcategories do |c|  %>
          <p><%= c.text_field :category, placeholder: 'カテゴリー名', autocomplete: 'off' %></p>
      <% end %>

      <%= f.text_area :content, rows: 8, placeholder: 'ブログの内容' %>

      <div class="formsubmit"><%= f.submit '投稿する' %></div>
    <% end %>

/model/blog.rb

class Blog < ApplicationRecord
  belongs_to :blogcategory

  attr_accessor :category
end

/model/blog_category.rb

class Blogcategory < ApplicationRecord
  has_many :blogs

  accepts_nested_attributes_for :blogs, allow_destroy: true
end
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

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

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

  • ただいまの回答率 91.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby on Rails

    6178questions

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