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

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

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

Haml(HTML abstraction markup language)は、HTML/XHTMLを効率的に記述するためのマークアップ言語および記法です。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Ruby on Rails

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

Q&A

解決済

1回答

1618閲覧

タグ付機能で no method error

KotaTakahashi

総合スコア8

Haml

Haml(HTML abstraction markup language)は、HTML/XHTMLを効率的に記述するためのマークアップ言語および記法です。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Ruby on Rails

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

0グッド

0クリップ

投稿2020/07/30 03:31

解決したいこと

タグ付の機能を実装しているのですが、問題が二つあります。
①タグ用のフォームに入力してもテーブルに保存されない。
②each文を使ってタグを取り出そうとしたが、no method errorになる

すみませんが、原因が分かる方教えてください。

#環境
rails 6.0.0
"haml-rails", ">= 1.0", '<= 2.0.1'
'pg', '>= 0.18', '< 2.0'

#エラー文
イメージ説明
(indexアクションの一覧表示画面)

#該当のソースコード
###【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テーブル自体は問題ありませんでした。

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

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

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

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

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

guest

回答1

0

ベストアンサー

②の方は、 action index で @tweetsは定義してありますが@tweetは作っていません。
ので @tweet がnil になってしまってます
ここは多分 @ なしの tweetではないかな?
詳細されているところに隠れているのでわかりませんが多分
@tweets.each do |tewwt|
ですよね?

①の方はこの質問からは見当が付きません。
「タグ用のフォーム」ってそこにある new ですか?これはtweetのフォームに見えます。

投稿2020/07/30 03:48

編集2020/07/30 03:52
winterboum

総合スコア23567

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

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

KotaTakahashi

2020/07/30 04:12

ありがとうございます!まさに教えていただいた通りでした!! 助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問