解決したいこと
タグ付の機能を実装しているのですが、問題が二つあります。
①タグ用のフォームに入力してもテーブルに保存されない。
②each文を使ってタグを取り出そうとしたが、no method errorになる
すみませんが、原因が分かる方教えてください。
#環境
rails 6.0.0
"haml-rails", ">= 1.0", '<= 2.0.1'
'pg', '>= 0.18', '< 2.0'
#該当のソースコード
###【tweets_controller.rb】
ruby
1class TweetsController < ApplicationController 2 before_action :set_tweet, only: [:edit, :show] 3 before_action :move_to_index, except: [:index, :show, :search] 4 5 def index 6 @tweets = Tweet.includes(:user).order("created_at DESC") 7 end 8 9 def new 10 @tweet = Tweet.new 11 end 12 13 def create 14 @tweet = Tweet.create(tweet_params) 15 if @tweet.save 16 tag_list = tag_params[:tag_names].split(/[[:blank:]]+/).select(&:present?) 17 @tweet.save_tags(tag_list) 18 redirect_to @tweet 19 else 20 render 'new' 21 end 22 end 23 24 def destroy 25 tweet = Tweet.find(params[:id]) 26 tweet.destroy 27 end 28 29 def edit 30 end 31 32 def update 33 tweet = Tweet.find(params[:id]) 34 tweet.update(tweet_params) 35 end 36 37 def show 38 @comment = Comment.new 39 @comments = @tweet.comments.includes(:user) 40 end 41 42 def search 43 @tweets = Tweet.search(params[:keyword]) 44 end 45 46 private 47 def tweet_params 48 params.require(:tweet).permit(:image, :text).merge(user_id: current_user.id) 49 end 50 51 def set_tweet 52 @tweet = Tweet.find(params[:id]) 53 end 54 55 def move_to_index 56 unless user_signed_in? 57 redirect_to action: :index 58 end 59 end 60 61 def tag_params 62 params.require(:tweet).permit(:tag_names) 63 end 64end
###【new.html.haml】
haml
1.Contents 2 .Container 3 = form_with model: @tweet, local: true do |form| 4 %h3 投稿画面 5 = form.text_field :tag_names 6 = form.text_field :image, placeholder: "photo", rows: "10" 7 = form.text_area :text, placeholder: "text", rows: "10" 8 = form.submit "投稿する"
###【index.html.haml】
haml
1#省略 2%article.PostedItem 3 .ArticleHeader 4 %ul.More 5 %li 6 = icon('fas', 'bars') 7 %ul 8 %li 9 = link_to '詳細', tweet_path(tweet.id), method: :get 10 - if user_signed_in? && current_user.id == tweet.user_id 11 %li 12 = link_to '編集', edit_tweet_path(tweet.id), method: :get 13 %li 14 = link_to '削除', tweet_path(tweet.id), method: :delete 15 16 .Picture 17 .content_post{style: "background-image: url(#{tweet.image})"} 18 .ReactionBtn 19 = icon('fas', 'star', class: 'ReactionBtn__good') 20 - @tweet.tags.each do |tag| 21 = tag.tag_name
#マイグレーションファイル
###【2020XXX_create_tweet_tag_relations。rb】
ruby
1class CreateTweetTagRelations < ActiveRecord::Migration[6.0] 2 def change 3 create_table :tweet_tag_relations do |t| 4 t.reference :tweet 5 t.reference :tag 6 7 t.timestamps 8 end 9 end 10end 11
###【2020XXX_create_tags】
ruby
1class CreateTags < ActiveRecord::Migration[6.0] 2 def change 3 create_table :tags do |t| 4 t.string :tag_name, null: false 5 6 t.timestamps 7 8 t.index :tag_name, unique: true 9 end 10 end 11end
#モデル
###【tag.rb】
ruby
1class Tag < ApplicationRecord 2 before_save :downcace_tag_name 3 4 has_many :tweet_tag_relations, dependent: :destroy 5 has_many :tweets, through: :tweet_tag_relations 6 7 validates :tag_name, presence: true, uniqueness: true, length: { maximum: 50 } 8 9 private 10 def downcase_tag_name 11 self.tag_name.downcase! 12 end 13end
###【tweet.rb】
ruby
1class Tweet < ApplicationRecord 2 validates :text, presence: true 3 has_many :comments 4 has_many :tweet_tag_relations, dependent: :destroy 5 has_many :tags, through: :article_tag_relations 6 def save_tags(tag_list) 7 tag_list.each do |tag| 8 unless find_tag = Tag.find_by(tag_name: tag.downcase) 9 begin 10 self.tags.create!(tag_name: tag) 11 rescue 12 nil 13 end 14 else 15 TweetTagRelation.create!(tweet_id: self.id, tag_id: find_tag.id) 16 end 17 end 18 end 19end
###【tweet_tag_reration.rb】
class TweetTagRelation < ApplicationRecord belongs_to :Tweet belongs_to :tag end
#試したこと
- 今回、なぜかフォームタグからタグに関する情報が保存されなかったので、table plusという RDBMSからデータを直接入力してみましたが、変化はありませんでした。
- エラー文からtagsテーブルのスペルミスかとも思ったのですがtagsテーブル自体は問題ありませんでした。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/30 04:12