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

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

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

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

Ruby on Rails 6

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

MySQL

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

Q&A

解決済

1回答

3515閲覧

Rails Simple Calendarで記事投稿後、カレンダーに反映させたい。

rrtts667

総合スコア18

Ruby

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

Ruby on Rails 6

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

MySQL

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

0グッド

0クリップ

投稿2020/07/25 17:56

Simple Calendarにて
記事投稿→カレンダー投稿画面(create)→カレンダーに反映という事を行いたいのですが、
現状、記事投稿は出来ていて、そこから記事投稿のタイトルデータを抜き出してカレンダー投稿画面にタイトルのみデータを表示取得させたいです。
イメージ説明
※こちらの画面ではTitleが入力フォームになっていますがこのTitleを、記事のTitleを取得したいです。

試した事ですが
イメージ説明

1、

  • @tweets.each do |tweet|

= @tweet.title
を入力しましたが
イメージ説明

このようなエラーが出ました。

blog(カレンダー)とtweet(記事)のアソシエーションとして
イメージ説明
イメージ説明
はこのように組んでいます。

blogのdb(データベース)はこちらになります。

ruby

1create_table :blogs do |t| 2 t.string :title 3 t.text :content 4 t.datetime :start_time 5 6 t.references :user, foreign_key: true 7 t.references :tweet, foreign_key: true 8 t.string :tweet_title 9 t.timestamps 10end

blog_controllerはこちらになります。

rails

1class BlogsController < ApplicationController 2 3def index 4@blogs = Blog.all 5end 6 7def new 8@blog = Blog.new 9end 10 11def show 12@blog = Blog.find(params[:id]) 13end 14 15def create 16@blog = current_user.blogs.new(blog_parameter) 17if @blog.save 18redirect_to blogs_path 19else 20redirect_to new_blog_path 21end 22end 23 24def destroy 25@blog = Blog.find(params[:id]) 26@blog.destroy 27redirect_to blogs_path, notice:"削除しました" 28end 29 30def edit 31@blog = Blog.find(params[:id]) 32end 33 34def update 35@blog = Blog.find(params[:id]) 36if @blog.update(blog_parameter) 37redirect_to blogs_path, notice: "編集しました" 38else 39render 'edit' 40end 41end 42 43private 44 45def blog_parameter 46params.require(:blog).permit(:title, :content, :start_time) 47end 48 49end

tweet_controllerはこちらになります。

rails

1class TweetsController < ApplicationController 2before_action :set_tweet, only: [:edit, :show] 3before_action :move_to_index, except: [:index, :show, :search] 4 5def index 6@tweets = Tweet.includes(:user) 7end 8 9def new 10@tweet = Tweet.new 11end 12 13def create 14Tweet.create(tweet_params) 15end 16 17def destroy 18tweet = Tweet.find(params[:id]) 19tweet.destroy 20end 21 22def edit 23end 24 25def update 26tweet = Tweet.find(params[:id]) 27tweet.update(tweet_params) 28end 29 30def show 31@comment = Comment.new 32@comments = @tweet.comments.includes(:user) 33end 34 35def search 36@tweets = Tweet.search(params[:keyword]) 37end 38 39private 40def tweet_params 41params.require(:tweet).permit( :title, :text, :image).merge(user_id: current_user.id) 42end 43 44def set_tweet 45@tweet = Tweet.find(params[:id]) 46end 47 48def move_to_index 49redirect_to action: :index unless user_signed_in? 50end 51 52end

記事投稿の際に他のページだとビューの表示は出来ました。
イメージ説明
イメージ説明
ご回答いただければ幸いです。
未熟者ですがよろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

undefined method `each' for nil:NilClass
BlogsController#newメソッド内で@tweetsを取得していないのでnilになっているため、nilに対してeachメソッドを呼び出してエラーになっています。

下記の要領でnewメソッド内で@tweetsを取得してViewに渡してあげれば解決できると思います。

ruby

1class BlogsController < ApplicationController 2 3def index 4 @blogs = Blog.all 5end 6 7def new 8 @tweets = Tweet.includes(:user) 9 @blog = Blog.new 10end 11 12--以下略--

追記

@はコントローラーで定義したインスタンス変数を指すので、下記だとエラーになってしまいます。

haml

1- @tweets.each do |tweet| 2 = @tweet.title

each文で定義した変数(tweet)を使用するので、正しくは下記のようになります。

haml

1- @tweets.each do |tweet| 2 = tweet.title

投稿2020/07/25 22:50

編集2020/07/26 03:07
oskamathis

総合スコア35

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

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

rrtts667

2020/07/26 02:42 編集

回答ありがとうございます。 回答通りやって見ましたが今度は NoMethodError in Blogs#newで undefined method `title' for #<Tweet::ActiveRecord_Relation:0x00007fec7d9d5af0> と出てしまいます。 呼び出し方がおかしいと思うのですがビューでは - @tweets.each do |tweet| = @tweets.title と呼び出していて出ていいるエラーコードは = @tweet.title になります。 試した事は = @tweets.title になります。 よろしくお願い致します。
oskamathis

2020/07/26 03:07 編集

すみません、回答の際に見逃していました。 `@`はコントローラーで定義したインスタンス変数を指すので、下記だとエラーになってしまいます。 ``` - @tweets.each do |tweet| = @tweet.title ``` each文で定義した変数(tweet)を使用するので、正しくは下記のようになります。 ``` - @tweets.each do |tweet| = tweet.title ```
oskamathis

2020/07/26 03:02

コメント欄だとわかりにくいので回答の方にも追記しておきます。
rrtts667

2020/07/26 03:08

早々のコメントありがとうございます。 無事に解決出来ました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問