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

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

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

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

Haml

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

Ruby

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

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

205閲覧

メッセージ送信時にビューに反映されない

yume0409

総合スコア45

Ruby on Rails 5

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

Haml

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

Ruby

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

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2020/01/23 07:42

編集2020/01/23 09:01

メッセージ送信された後、ビューに反映されない。
簡易チャットアプリを作成しています。
コントローラーはこのようになっています。

def index @tweets = Tweet.includes(:user) end def new end def create Tweet.create(text: tweet_params[:text], user_id: current_user.id) redirect_to tweets_path end private def tweet_params params.permit(:text) end

indexはチャットビューのアクションです。
newアクションには何も定義していません。
createアクションは送信された時に内容を保存する記述を書きました。
それとストロングパラメーターを用いて悪意のあるユーザーから守る記述も書きました。
これで送信するとcreateアクション(tweets_path)へリダイレクトされますが、ビューに反映されないのです。
データベースはSQLProを使っているのですが、確認すると送信内容は保存されています。
なので反映させる記述がビューに必要?だと思いましたが、どういう風に記述していいのか、分かりません。。。

#試した内容
create.html.haml

.chat-main .tweets-block .user-name aaa .messages = tweets.text %i.fas.fa-ellipsis-h = link_to "返信", "#", class: "reply" .time 時間 .tweets = link_to new_tweets_path do %i.fas.fa-pen

ビューに反映したいクラス名はmessagesです。
そこをtweetsテーブルのtextカラムから取ってきたいので、

= tweets.text

としてみましたが、反映されていません。
ちなみにエラーは出ていません。
一体何が悪いのでしょうか?

よろしくお願いします。

#補足
回答ありがとうございます!

def create @tweet = Tweet.create(text: tweet_params[:text], user_id: current_user.id) end private def tweet_params params.permit(:text) end

createアクションはこのようにしました。
@tweet = を付け足して、redirect_to tweets_pathを消しました。
そしたら自動的にcreate.html.hamlが呼び出され、create.hrml.hamlは

.chat-main .tweets-block .user-name aaa .messages = @tweet.text %i.fas.fa-ellipsis-h = link_to "返信", "#", class: "reply" .time 時間 .tweets = link_to new_tweets_path do %i.fas.fa-pen

このようにしました。
とりあえず、テキストの部分は反映されたのですが、その直後リロードするとshow.html.hamlに遷移され、
= @tweet.textを定義しても

NoMethodError in Tweets#show undefined method `text' for nil:NilClass

というエラーが出ます。。。

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

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

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

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

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

winterboum

2020/01/23 08:04

その create action ですと create.html には行かず index.html に行きます。 index.html のviewを載せてください
yume0409

2020/01/23 08:13

index.html.hamlはcreate.html.hamlと同じ記述です。 indexのビューに「= tweets.text」とすると、 メッセージ送信された時に 「NameError in Tweets#index undefined local variable or method `tweets' for #<#<Class:0x00007ff702810a78>:0x00007ff7005e03b8> Did you mean? @tweets」 こういうエラーが出ます。
shinoharat

2020/01/23 08:24

チャットということは、create 後に表示したいのは「すべてのTweet」でしょうか?
guest

回答1

0

ベストアンサー

index.htmlがcreate.htmlと同じとすると、ここには createに飛ぶための仕掛けがないので、create actionを呼ぶのは別のviewと言うことですね?

さて、

undefined local variable or method tweets がでるのはそのとおり、未定義だからです。
createしたてのteetを表示したいのでしたら、create actiion にて
@tweet = Tweet.create(...) として
create view にて= tweets.text ではなく = @tweet.text としてください。

Tweetを全部表示したいなら、index にredirect させてそちらに任せます。

なお、
Railsが想定しているのは
index は一覧、一件ずつ表示は show、作製は new、編集はeditです。
createは成功したら showかindex、失敗したら new。
ですので、
いまの以下の構成は Rails屋が相談を受けた時に説明を要する想定外の使い方なので、薦めません
0. create のview がある
0. index のviewが(createと同じく)1件表示

実はindexは @tweetsを、create.indexも同じく一覧を、ということですとviewの書き方がまるでちがいます。
@tweetでloopさせないと

投稿2020/01/23 08:28

winterboum

総合スコア23329

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

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

yume0409

2020/01/24 08:12

ありがとうございます! 無事、解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問