中間テーブルを用いて投稿に紐ずくタグを配列として表示させたい
現在、投稿に紐ずくタグ付け機能を実装しているのですが、タグが配列として複数表示できるような実装
をイメージしております。
配列としてタグを複数投稿できるような実装に変えたところ、今まで保存できていた中間テーブルが保存できないようになり、投稿にタグが表示されずにタグも配列として保存されずにひとかたまりにデーターベースに保存されてしまいます。
また、formオブジェクト
を用いて複数のテーブルに保存される機能にしているため、どのような記述方法が正解なのか分からない状況です。
formオブジェクトやタグ付け機能などの詳しい方がおりましたら、ご教授願えますでしょうか。
発生している問題・エラーメッセージ
1・保存したタグが配列として取得できない
2・投稿テーブルとタグテーブルにおける中間テーブルの値が保存されない
3・投稿時にエラーが表示されるが、データベース常に値は保存されておりトップページに戻ると問題なく表示される
上記1、2のコンソール上の出力結果
consol
1[1] pry(#<UploadsController>)> UploadTagRelation.create 2=> #<UploadTagRelation:0x00007fdb13f9cdb0 id: nil, upload_id: nil, tag_id: nil, created_at: nil, updated_at: nil> 3[2] pry(#<UploadsController>)> params[:upload_form][:name] 4=> "東京 渋谷 カフェ" 5[3] pry(#<UploadsController>)>
投稿時に表示されるエラー画面
NameError in UploadsController#create undefined local variable or method `tag' for #<UploadForm:0x00007fdb25ceff38 @errors=#<ActiveModel::Errors:0x00007fdb25ced7b0 @base=#<UploadForm:0x00007fdb25ceff38 ...>, @errors=[]>, @title="カフェ", @text="タグカフェ", @url="", @working_day="", @day_off="", @cafe_wifi_id="1", @cafe_charging_id="1", @cafe_smoking_id="1", @image=#<ActionDispatch::Http::UploadedFile:0x00007fdb13eb42e0 @tempfile=#<Tempfile:/var/folders/gw/k3mqyqh15y37h56g1b17ymvc0000gn/T/RackMultipart20210514-85259-f73ob5.jpeg>, @original_filename="2f211d6f387d6006a68f.jpeg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"upload_form[image]\"; filename=\"2f211d6f387d6006a68f.jpeg\"\r\nContent-Type: image/jpeg\r\n">, @name="東京 渋谷 カフェ", @user_id=1, @validation_context=nil> Did you mean? tap Extracted source (around line #32): 30 31 32 33 34 end UploadTagRelation.create(upload_id: upload.id, tag_id: tag.id)⇦この部分 end end tag_list = params[:upload_form][:name].split(",") if @upload.valid? @upload.save(tag_list)⇦この部分 redirect_to root_path else render new
該当のソースコード
app/controllers/upload_controller
class UploadsController < ApplicationController def index @uploads = Upload.all.order(created_at: :desc) end def new @upload = UploadForm.new end def create # binding.pry @upload = UploadForm.new(upload_params) tag_list = params[:upload_form][:name].split(",") if @upload.valid? @upload.save(tag_list) redirect_to root_path else render new end end def show @upload = Upload.find(params[:id]) @tag = @upload.tags end def destroy @upload = Upload.find(params[:id]) @upload.image.purge if @upload.image.attached? if @upload.destroy redirect_to root_path else render :show end end private def upload_params params.require(:upload_form).permit(:title, :text, :url, :working_day, :day_off, :cafe_wifi_id, :cafe_charging_id, :cafe_smoking_id, :image, :name).merge(user_id: current_user.id) end end
app/models/form_model
model
1class UploadForm 2 include ActiveModel::Model 3 attr_accessor :title, :text, :url, :working_day, :day_off, :cafe_wifi_id, :cafe_charging_id, :cafe_smoking_id, 4 :user_id, :image, :name 5 6 with_options presence: true do 7 validates :title 8 validates :text 9 validates :cafe_wifi_id 10 validates :cafe_charging_id 11 validates :cafe_smoking_id 12 validates :user_id 13 validates :image 14 validates :name 15 end 16 17 with_options numericality: { other_than: 0 } do 18 validates :cafe_wifi_id 19 validates :cafe_charging_id 20 validates :cafe_smoking_id 21 end 22 23 def save(tag_list) 24 upload = Upload.create(title: title, text: text, url: url, working_day: working_day, day_off: day_off, cafe_wifi_id: cafe_wifi_id, cafe_charging_id: cafe_charging_id, cafe_smoking_id: cafe_smoking_id, user_id: user_id, image: image) 25 # tag = Tag.create(name: name) 26 27 tag_list.each do |tag_name| 28 tag = Tag.where(name: tag_name).first_or_initialize 29 tag.save 30 end 31 32 UploadTagRelation.create(upload_id: upload.id, tag_id: tag.id) 33 end 34end
app/models/upload.rb
model
1class Upload < ApplicationRecord 2 has_one_attached :image 3 has_one :map 4 belongs_to :user 5 has_many :upload_tag_relations, dependent: :destroy 6 has_many :tags, through: :upload_tag_relations, dependent: :destroy 7 extend ActiveHash::Associations::ActiveRecordExtensions 8 belongs_to :cafe_smoking 9 belongs_to :cafe_charging 10 belongs_to :cafe_wifi 11end
app/models/upload_tag_relation.rb
model
1class UploadTagRelation < ApplicationRecord 2 belongs_to :tag 3 belongs_to :upload 4end
app/models/tag.rb
model
1class Tag < ApplicationRecord 2 has_many :upload_tag_relations 3 has_many :uploads, through: :upload_tag_relations 4 5 validates :name, uniqueness: true 6end
試したこと
*コントローラーのcreateアクションの記述に誤りがないか確認してみたところ、@upload=UploadForm.new(upload_params)
でformオブジェクトモデルを渡しているので中間テーブルは保存されるはずができない。
*tag_list = params[:upload_form][:name].split(",")
で配列として処理される記述にしているが、まとまって出力されてしまう。
*formオブジェクト内でUploadTagRelation.create(upload_id: upload.id, tag_id: tag.id)
と記述しているが中間テーブルが保存されない
https://tomo-bb-aki0117115.hatenablog.com/entry/2020/10/29/232822
https://qiita.com/kurawo___D/items/e9a2dd0bf46cca706e5c
補足情報(FW/ツールのバージョンなど)
開発環境
・rubymine
・ruby(3.0.1)
・Ruby on rails (6.1.3.1)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/15 09:09