前提・実現したいこと
Ruby on Railsdでチャットアプリを作っています。
Gemを使用せずにタグ機能を実装しております。
投稿フォームにスペース区切りでタグを複数投稿して、タグをテーブルに保存したいです。
タグの新規作成時にtagsテーブルのtextというカラムに投稿されたタグをsaveしたいのですが、失敗しております。
同じ登録フォームにて、tags関連付けされたall_users_chatsというテーブルのnameカラムはsave出来ております。
初回の個人制作アプリのため、コードが読み難いかと思っておりますが、アドバイス頂けましたら幸いです。
発生している問題・エラーメッセージ
[3] pry(#<AllUsersChatsController>)> all_users_chat_params Unpermitted parameter: :texts => <ActionController::Parameters {"name"=>"タグのテスト", "user_id"=>2} permitted: true> [4] pry(#<AllUsersChatsController>)> tag_params Unpermitted parameter: :name => <ActionController::Parameters {"texts"=>"タグ テスト"} permitted: true> [5] pry(#<AllUsersChatsController>)> tag_list => ["タグ", "テスト"] [10] pry(#<AllUsersChatsController>)> exit Tag Load (0.5ms) SELECT `tags`.* FROM `tags` WHERE `tags`.`text` = 'タグ' LIMIT 1 ↳ app/models/all_users_chat.rb:41:in `block in save_tags' Tag Load (0.4ms) SELECT `tags`.* FROM `tags` WHERE `tags`.`text` = 'テスト' LIMIT 1 ↳ app/models/all_users_chat.rb:41:in `block in save_tags'
該当のソースコード
ruby
1#all_users_chat_model 2class AllUsersChat < ApplicationRecord 3 belongs_to :user 4 has_many :comments, dependent: :destroy 5 has_many :tags, through: :all_users_chat_tags 6 has_many :all_users_chat_tags, dependent: :destroy 7 8 validates :name, presence: true, uniqueness: true 9 10 mount_uploader :image, ImageUploader 11 12 def save_tags(tag_list) 13 tag_list.each do |tag| 14 # 受け取った値を小文字に変換して、DBを検索して存在しない場合は 15 # find_tag に nil が代入され nil となるのでタグの作成が始まる 16 unless find_tag = Tag.find_by(text: tag.downcase) 17 begin 18 self.tags.create!(text: tag) 19 # @all_users_chat.tags.create!(text: tag) 20 rescue 21 nil 22 end 23 else 24 AllUsersChatTag.create!(all_users_chat_id: self.id, tag_id: find_tag.id) 25 end 26 end 27 end 28end 29 30 31#tag_model 32class Tag < ApplicationRecord 33 before_save :downcase_tag_name 34 35 validates :text, presence: true, uniqueness: true 36 # validates :text, presence: true, uniqueness: { case_sensitive: true } 37 38 has_many :all_users_chat_tags, dependent: :destroy 39 has_many :all_users_chats, through: :all_users_chat_tags 40 41 private 42 43 # タグ名を小文字に変換 44 def downcase_tag_name 45 self.text.downcase! 46 end 47end 48 49#all_users_chat_tags_model(中間テーブル) 50class AllUsersChatTag < ApplicationRecord 51 belongs_to :all_users_chat 52 belongs_to :tag 53end 54 55#all_users_chats_controller 56class AllUsersChatsController < ApplicationController 57 before_action :set_all_users_chat, only: [:show, :destroy] 58 59 def index 60 @all_users_chats = AllUsersChat.all 61 end 62 63 def new 64 @all_users_chat = AllUsersChat.new 65 @tag_list = Tag.all 66 @all_users_chats = AllUsersChat.all 67 end 68 69 def create 70 @all_users_chat = AllUsersChat.new(all_users_chat_params) 71 tag_list = tag_params[:texts].split(/[[:blank:]]+/).select(&:present?) 72 if @all_users_chat.save 73 @all_users_chat.save_tags(tag_list) 74 75 redirect_to all_users_chats_path, notice: '新しい全体公開チャットが作成されました' 76 else 77 78 render :new, notice: '同じタイトルは登録できません' 79 end 80 redirect_to all_users_chat_path(@all_users_chat), notice: '新しい全体シャットが作成されました' 81 end 82 83 def destroy 84 if (@all_users_chat.user_id == current_user.id) || (current_user.id == @comment.user_id) 85 if @all_users_chat.destroy 86 redirect_to all_users_chats_path, notice: '全体公開チャットを1件削除しました' 87 else 88 render redirect_to all_users_chats_path, notice: '削除が失敗しました' 89 end 90 else 91 redirect_to all_users_chats_path, notice: '作成者しか削除できません' 92 end 93 end 94 95 private 96 def all_users_chat_params 97 params.require(:all_users_chat).permit(:name, :image, :user_id).merge(user_id: current_user.id) 98 end 99 100 def set_all_users_chat 101 @all_users_chat = AllUsersChat.find(params[:id]) 102 end 103 104 def tag_params 105 params.require(:all_users_chat).permit(:texts) 106 end 107 108end 109 110#投稿フォームのビュー 111.contents.row 112 .container 113 %h3 新しい全体公開チャット投稿画面 114 = form_with(model: @all_users_chat, local: true) do |form| 115 .SettingGroupForm 116 %h1 投稿する 117 .SettingGroupForm__field 118 .SettingGroupForm__leftField 119 = form.label :name, "全体公開チャットのタイトル", class: 'SettingGroupForm__label' 120 .SettingGroupForm__rightField 121 = form.text_area :name, placeholder: "text" , rows: "4" 122 .footer__form__label 123 .footer__form__icon 124 = form.file_field :image, placeholder: "Image Url" 125 .SettingGroupForm__leftField 126 = form.label :texts, "タグ", class: 'SettingGroupForm__label' 127 .SettingGroupForm__rightField 128 = form.text_area :texts, placeholder: "スペースを入力することで複数のタグを付けることができます" , rows: "3" 129 .SettingGroupForm__field 130 .SettingGroupForm__leftField 131 .SettingGroupForm__rightField 132 = form.submit class: 'SettingGroupForm__button' 133
試したこと
all_users_chatコントローラーのcreateアクション内と、
tagをsaveするメソッドsave_tagsを記述したall_users_chatモデル内で、
binding.pryを行ったところ、
必要なparams(all_users_chat: name, user_id, tag: texts)は取得できていました。
all_users_chat.rbのsave_tagsメソッド内で、
begin
self.tags.create!(text: tag)
に失敗して、
rescue
nil
へ遷移していました。
ターミナルの結果を見ても、`block in save_tags'とsave失敗の記述がありました。
タグを正しくsaveする方法について、アドバイス頂けますと幸いです。
補足情報(FW/ツールのバージョンなど)
ruby 2.6.5
ここにより詳細な情報を記載してください。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。