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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

タグ

特殊な記法により文書に埋め込む形で記述される付加情報をタグと呼びます。文書構造や書式、文字飾りなどを指示したり、画像や他の文書へのリンクを埋め込むことができる。

Ruby on Rails

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

767閲覧

中間テーブルが保存されずタグを配列として表示できない

yuu0000

総合スコア4

Ruby

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

タグ

特殊な記法により文書に埋め込む形で記述される付加情報をタグと呼びます。文書構造や書式、文字飾りなどを指示したり、画像や他の文書へのリンクを埋め込むことができる。

Ruby on Rails

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/05/14 07:49

中間テーブルを用いて投稿に紐ずくタグを配列として表示させたい

現在、投稿に紐ずくタグ付け機能を実装しているのですが、タグが配列として複数表示できるような実装をイメージしております。

配列としてタグを複数投稿できるような実装に変えたところ、今まで保存できていた中間テーブルが保存できないようになり、投稿にタグが表示されずにタグも配列として保存されずにひとかたまりにデーターベースに保存されてしまいます。

また、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://post-output.com/185/

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)

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

そのえらーについてのみでしたら

tag_list.each do |tag_name| tag = Tag.where(name: tag_name).first_or_initialize tag.save end UploadTagRelation.create(upload_id: upload.id, tag_id: tag.id)

each の外にあるので、tag が未定義なわけです。
中にいれればそのエラーはなくなります

投稿2021/05/15 02:01

winterboum

総合スコア23284

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuu0000

2021/05/15 09:09

ご連絡ありがとうございます! 外部にあるために読み込むことができていないんですね。 お忙しいところ誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問