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が上手く設定できていないのかなと思っているのですが、原因がよく分かりません。 何かヒントになることでも良いので、よろしければご教授お願いいたします。
あなたの回答
tips
プレビュー