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

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

ただいまの
回答率

90.99%

  • Ruby

    6388questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    6220questions

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

複数選択可能なセレクトボックスを作成したが複数の値を保存出来ない

受付中

回答 0

投稿

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

tky31

score 2

Ruby on Rails 5.1.4
Ruby 2.4.1

Parameters: {"utf8"=>"✓", "authenticity_token"=>"zKLg8wAY6hi5B2lJld6VWA3V4yAdtC1lrNLYpIBuweCvqZlExxDKAtI43LnwaA15UOmpbkupHEeGjJoPEFovWg==", **"video"=>{"title"=>"test", "youtube_id"=>"test"}, "genre"=>{"name"=>["", "A", "B", "C"]}, "commit"=>"登録する"}**

   (0.1ms)  begin transaction
  SQL (2.5ms)  INSERT INTO "videos" ("title", "created_at", "updated_at", "youtube_id") VALUES (?, ?, ?, ?)  [["title", "test"], ["created_at", "2017-10-15 10:26:29.824962"], ["updated_at", "2017-10-15 10:26:29.824962"], ["youtube_id", "test"]]

   (0.8ms)  commit transaction
  Genre Load (0.2ms)  SELECT  "genres".* FROM "genres" WHERE "genres"."name" IN ('', 'A', 'B', 'C') LIMIT ?  [["LIMIT", 1]]
   (0.1ms)  begin transaction
  SQL (0.5ms)  INSERT INTO "video_genres" ("created_at", "updated_at", "genre_id", "video_id") VALUES (?, ?, ?, ?)  [["created_at", "2017-10-15 10:26:29.847629"], ["updated_at", "2017-10-15 10:26:29.847629"], **["genre_id", 1], ["video_id", 1]]**
   (0.9ms)  commit transaction

実現したいこと

["genre_id", 1], ["video_id", 1]]
["genre_id", 2], ["video_id", 1]]
["genre_id", 3], ["video_id", 1]]
フォームから上記の様に1つのvideo_idに対して複数のgenre_idを紐付けて保存したいが、複数選択しても["genre_id", 1], ["video_id", 1]]だけ保存されてしまいます。
何か対応策ないでしょうか。

VideosController

    def index
        @videos = Video.all
    end

    def show
      @videos = Video.all.find_by(id: params[:id])
    end

    def new
      @video = Video.new
      @genre = Genre.all
    end

    def fields
      @video = Video.find(1)
    end

    def create
      @video = Video.new(video_params)

      if @video.save
        @genre = Genre.find_by(name: params[:genre][:name])
        @vg = VideoGenre.new(genre_id: @genre.id, video_id: @video.id) 
          if @vg.save
            redirect_to @video, notice: "登録しました"
          else
            render 'new'
          end
      end
    end

    private

        def video_params
          params.require(:video).permit(:title, :youtube_id, { :genre_id=> [] })
        end

モデル

class Genre < ApplicationRecord
  has_many :video_genre
  has_many :video, through: :video_genre
end
class Video < ApplicationRecord
  has_many :video_genre
  has_many :genres, through: :video_genre
end

中間テーブル

class VideoGenre < ApplicationRecord
  belongs_to :genre, optional: true
  belongs_to :video, optional: true
end

Views/new.html.erb(フォーム)

<%= form_for @video do |f| %>

  <div class="field">
    <%= f.label :title, "タイトル" %>
    <%= f.text_field :title %>
  </div>

  <div class="field">
    <%= f.label :youtube_id, "YoutubeID" %>
    <%= f.text_field :youtube_id %>
  </div>

<%= field_set_tag 'ジャンル選択' do %>
  <%= fields_for @video.genres do |af| %>
    <div class="field">
      <%= af.collection_select(:name, @genre, :name, :name,{},{multiple: true}) %>

    </div>
  <% end %>
<% end %>

<div class="actions">
    <%= f.submit "登録する" %>
  </div>

<% end %>

```
個人的にはStrong Parametersが上手く設定できていないのかなと思っているのですが、原因がよく分かりません。
何かヒントになることでも良いので、よろしければご教授お願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

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

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

関連した質問

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

  • Ruby

    6388questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    6220questions

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