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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

1278閲覧

rails のフラッシュメッセージについて

nobita

総合スコア66

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2021/06/10 10:54

お世話になります。
現在 Railsで フラッシュメッセージを表示させたいのですが、

記事のページから コメントというリンクを踏むと、コメントページが表示され、コメントが投稿できるようになっております。
コメントを投稿したら、リダイレクトして、記事のページに戻り、投稿しました!とフラッシュメッセージを表示したいのですが、
うまくいかないので、アドバイスをいただきたいです。

現状

記事コントローラー

rails

1 def show 2 3 end 4

コメントコントローラー

rails

1 def create 2 3 @kiji = Kiji.new( 4 kiji: @kiji 5 ) 6 7 @kiji.attributes = { 8 body: params[:comment][:body], 9 } 10 if recaptcha_valid?(@kiji, :create) && @kiji.save 11 render json: { 12 status: 'success', 13 message: '投稿しました' 14 } 15 else 16 render json: { 17 status: 'error', 18 message: 'NG', 19 messages: @kiji.errors.full_messages 20 } 21 end 22 end 23 format.any do 24 if recaptcha_valid?(@kiji, :create) && @kiji.save 25 flash[:notice] = '投稿しました' 26 redirect_to kiji_path(@kiji) <-------------------コメントした記事ページに戻る 27 28 else 29 new 30 end 31 end 32 end 33 end

コメントコントローラーからリダイレクトした、記事のページの show のコントローラーになにか記述が必要なのでしょうか?

記事のページの上部には、

show.html

html

1{% if notice.present? %} 2 <div class="sysmsg alert alert-info"> 3 <button class="close" data-dismiss="alert"><span class="fa fa-times"></span></button> 4 {{ notice }} 5 </div> 6{% endif %} 7 8{% if alert.present? %} 9 <div class="sysmsg alert alert-danger"> 10 <button class="close" data-dismiss="alert"><span class="fa fa-times"></span></button> 11 {{ alert }} 12 </div> 13{% endif %} 14

としてみたのですが、なにも表示されません。。。

アドバイスをお願いします。

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

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

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

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

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

asm

2021/06/10 11:15

コントローラのdef-endの対応が取れてませんが、省略などしているのでしょうか? Railsでは見ないタイプのhtmlテンプレートエンジンですが何をご利用ですか?
guest

回答1

0

ベストアンサー

おそらくrequest.formatによって@kiji.attributes = ...を実行したりしなかったりするのが気になります。
formatによる差異はシンプルに表示(レンダリング)だけに留めたほうがよいです。

ruby

1def create 2 @kiji = Kiji.new(kiji: @kiji) 3 @kiji.attributes = { body: params[:comment][:body] } 4 5 if recaptcha_valid?(@kiji, :create) && @kiji.save 6 # 成功時 7 success_on_create(@kiji) 8 else 9 # 失敗時 10 error_on_create(@kiji) 11 end 12end 13 14private 15def success_on_create(kiji) 16 respond_to do |format| 17 format.json do 18 render json: { 19 status: 'success', 20 message: '投稿しました' 21 } 22 end 23 format.any do 24 flash[:notice] = '投稿しました' 25 redirect_to kiji_path(kiji) 26 end 27 end 28end 29 30def error_on_create(kiji) 31 respond_to do |format| 32 format.json do 33 render json: { 34 status: 'error', 35 message: 'NG', 36 messages: kiji.errors.full_messages 37 } 38 end 39 format.any do 40 # new # 必要ならば 41 render :new 42 end 43 end 44end

その上で、redirect先でflash[:notice]があるのか
viewテンプレートからnoticeで呼び出せるのか、を調べていきます。

投稿2021/06/10 13:04

asm

総合スコア15149

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

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

nobita

2021/06/11 03:00

ありがとうございます。 現状、 URL に ページURL?flash='投稿しました’ みたいにでているんですが、これは View がわるいのでしょうか?
asm

2021/06/11 03:24

flash[:notice]はセッションを用い、基本的にcookieを使うと思いますが・・・ redirect_to kiji_path(kiji)の結果`ページURL?flash='投稿しました’`へリダイレクトしているのでしょうか? それとも、render json: {statuse: 'success', message: '投稿しました}の結果ですか? もしくはそれ以外でしょうか?
nobita

2021/06/11 04:15

redirect_to kiji_path(@kiji) , flash: { :notice: '投稿しました' } とリダイレクトの時に、 ,で区切りパラメーターを与えてみたのですが、、、
nobita

2021/06/11 05:54

↑はリダイレクト先のコントローラーで パラメーターを受け取り、 flash[:notice] に代入することでできました。 画面には出力されるようになったのですが、既にできあいの物を使っているためよくわからないのですが、 リダイレクト先の kji_path は showメソッドで show.html なのですが、 content_for :footer としたに数行のコードしかなく、そこに記述すると画面の下に表示されてしまいます。 こういったとき、画面の構成やどこに書いたら上部に表示されるなど、調べる方法はあるのでしょうか? よろしくお願いいたします。
asm

2021/06/11 08:40

もしかしてですがApplicationControllerもしくはコメントコントローラーがActionController::APIを継承していませんか? その場合、flashを使うために「include ActionController::Flash」が必要です。 > content_for :footer app/views/layouts/フォルダの中にあるどれかを調べる事になります。 controllerでlayout指定をしていないのであれば「application.html.なんとか」でしょう
nobita

2021/06/11 09:51 編集

ありがとうございます! ApplicationController は下記です。 ApplicationController < BaseController となっており、 APIは継承していないようです。 >>controllerでlayout指定をしていないのであれば「application.html.なんとか」でしょう render layout: true とかになっております。これは app/views/layouts を指定しているという意味なのでしょうか?
nobita

2021/06/11 09:54

layout の show.html では、 記事コントローラーの def show から はパラメーターは受け取れないのでしょうか? 記事コントローラーの def show の show.html の中に、 content_for :footer となっており、 そこに flash を記述すると下部に表示されます。 これを layoutの show.htmlでも実現が可能なのでしょうか?
asm

2021/06/11 10:11

> ApplicationController < BaseController ActionController::BaseではなくBaseControllerですか > render layout: true とかになっております。これは app/views/layouts を指定しているという意味なのでしょうか? そうですね。layout: falseやいくつかの例外(json: ...やplain:...など)を除けば ほぼなんらかのlayoutファイルを用いています。 なお、大抵のlayoutは、content_forの外側に書けばメイン部分に記述される筈です。
nobita

2021/06/11 10:19

layoutの HTML をいじったら上手くできました!!! content_for :head という形で埋め込みでできました!ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問