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

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

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

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

Ruby on Rails

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

Q&A

3回答

12604閲覧

renderされているが、flashが表示されない・・・・・・

shinichiro81

総合スコア11

Ruby

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

Ruby on Rails

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

0グッド

2クリップ

投稿2017/08/09 01:42

modelでバリデーションをかけ、失敗した場合に、errorsに入るメッセージをflash.nowを使い、viewで取り出したいのですが、上手くできません。

ruby

1#コントローラー 2 3def create 4 ・・・中略 5 if @hoge.save 6 redirect_to hoge_path 7 end 8 flash.now[:error] = @hoge.errors.full_messages 9 render :new 10end

ruby

1/<new.html.haml> 2 3-if flash[:error].present? 4 -binding.pry 5 -@address.errors.full_messages.each do |message| 6 %h2 7 =message 8 ・・・中略

new.html.hamlの2行目のbinding.pryでとまります。
ということは、renderはされていて、if文の中まで処理が進んでいるということだと思います。
flash[:error]の中身を見ても、ちゃんと入っていることが確認できます。
しかし、なぜなのか、viewに表示されません。
ちなみに、render :newの部分を、redirect_to + flashに書き換えたら表示できました。

renderとredirect_toの違いは自分でも調べてみて、
render=>画面描画のみ、
redirect_to => コントローラーを介してのviewの表示ということはわかりました。

ifの中まで処理が進んでいるので、画面は適切にrenderされているのだと思います。
しかし、なぜflashメッセージが表示されないのでしょうか??
周りにrubyに詳しい人がいないため、昨日の夕方から悩み続けています。
どなたか教えて下さい。お願いします。

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

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

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

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

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

guest

回答3

0

Ruby

1if @hoge.save 2 redirect_to hoge_path 3end 4 flash.now[:error] = @hoge.errors.full_messages 5 render :new

これだと全てnewに戻ってきてしまうので、以下のようにしたらどうでしょう。

Ruby

1if @hoge.save 2 redirect_to hoge_path 3else 4 flash.now[:error] = @hoge.errors.full_messages 5 render :new 6end

flashはviewで拾った方がいいとは思いますが。取り急ぎ。

投稿2017/08/09 06:03

zooiiooz

総合スコア176

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

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

shinichiro81

2017/08/09 07:26

zooiioozさん、解答ありがとうございます。 何かの手違いだと思うのですが、 zooiioozさんに掲げていただいたコードが私のものと同じになっているので、 よろしければ、改善したコードを教えていただけないでしょうか??
zooiiooz

2017/08/09 09:42

最初のコードが if @hoge.save redirect_to hoge_path end flash.now[:error] = @hoge.errors.full_messages render :new end となってたので、最初のendをelseと間違えたのかと思ったのですが...。
shinichiro81

2017/08/09 12:30

zooiioozさん,大変失礼しました。 私のコードを修正して頂けていたのですね。 そうと気づかずに、無礼なコメントをしてしまいました。 申し訳ございません。 しかし、直して頂いたコードで試して見ても、解決しませんでした・・・・・・ new.html.hamlがrenderされるところまではいきますし(binding.pryで止まる)、 flashに中身が入っていることも確認済みなのですが、 なぜか表示されません。 renderでなくredirect_toを使えば、表示できるので、そんなに困ってはいないのですが、 なぜなのかとても気になってしまって。
guest

0

2017年の質問ですが、同じような問題にハマったので記述しておきます。
同じように、redirectすると flash[:alert] などを表示できるが、renderではできませんでした。

質問者のshinichiro81さんのviewでの実装が不明なので解決するかわかりませんが、
もし、viewで form_with を使用している場合、local: true オプションをつけるとrenderで表示されるようになります。

ruby

1= form_with url: xxx_path, method: :post, local: true do |f|

https://qiita.com/Tatsu88/items/8ea9b944681a48cce589

投稿2020/02/18 06:47

ryusei_21

総合スコア14

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

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

0

flash[:error] にエラーメッセージを格納してるのに、
なぜView側では@address.errorsを見てるのでしょう?

flash[:error].each do |message|で普通に取れると思うのですが、
いかがでしょうか?

投稿2017/08/10 03:32

tashua314

総合スコア145

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

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

shinichiro81

2017/08/10 04:32

tashua314さん、ありがとうございます。 なるほど!ご指摘のコードの方が短くてスッキリしますね。 訂正させていただきました。 だけど、やっぱりrenderだと表示されませんね。redirect_toだと可能なのですが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問