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

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

ただいまの
回答率

90.84%

  • Ruby on Rails

    6554questions

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

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

受付中

回答 0

投稿

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

ruby_0ct

score 34

ブログ内容などを格納するブログ本体テーブルカテゴリーテーブルの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

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

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

def create
    # idは順番に割り振りたいので、99以外の最大値を取得し、+1で順番にidを指定して割り当てます
    category_maxid = Blogcategory.where.not(id: 99).maximum(:id)
    category_maxid = category_maxid + 1

    # paramsの中身によって新しくカテゴリーを追加する投稿かどうかifで判断します
    # 今回は追加する場合のみのif文処理を書きます。
    if params[:blog][:blogcategory_id] == '99'
      # カテゴリーを新規追加する場合の処理
      params[:blog][:blogcategory_id] = category_maxid.to_s # 文字列型でparamsに取得したidを割り当て
      @blog = Blog.new(blog_params)

      if @blog.save
          puts('=======カテゴリー正常追加=======')
          redirect_to blogs_url and return
        else
          puts('=======保存失敗=======')
          redirect_to blogs_url and return
        end
    else
      # エラー処理などは省きます。
    end

  @blog = Blog.new(blog_params)

  if @blog.save
    redirect_to blogs_url and return
  else
    redirect_to blogs_url and return
  end
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 # DBには存在しないカラムを追加。DBには登録しない
end

/model/blog_category.rb

class Blogcategory < ApplicationRecord
  has_many :blogs

  accepts_nested_attributes_for :blogs, allow_destroy: true # 2つのフォームでDBに登録可能にする
end
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正の依頼

  • gouf

    2018/01/13 19:03

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

    キャンセル

  • ruby_0ct

    2018/01/14 16:55

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

    キャンセル

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

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

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

関連した質問

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

  • Ruby on Rails

    6554questions

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