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

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

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

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

Q&A

1回答

1359閲覧

render先へインスタンス変数が渡らない

kobo_

総合スコア1

Ruby on Rails 5

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

0グッド

0クリップ

投稿2022/03/12 12:40

編集2022/03/12 23:52

ログイン失敗時のメッセージをインスタンス変数とし、Viewで表示したいのですができません。
・controller( login_controller.rb )

class LoginController < ApplicationController def index @msg = 'これからログインします。' end def auth usr = User.find_by(username: params[:username]) if usr && usr.authenticate(params[:password]) then reset_session session[:usr] = usr.id redirect_to params[:referer] else flash.now[:referer] = params[:referer] @error = 'ユーザ名/パスワードが間違っています。' logger.debug('@errorをセットしました。') render action: :index end end end

・view( index.html.erb )

<p style="color: Red"> <%= @error %> <%= @msg %> </p> <%= form_with url: "/login/auth" do |form| %> <div class="field"> <%= form.label :username, 'ユーザ名' %> : <br /> <%= form.text_field :username, size: 20 %> </div> <div class="field"> <%= form.label :password, 'パスワード' %><br /> <%= form.password_field :password, size: 20 %> </div> <!--ログイン後にリダイレクトすべきアクションを隠しフィールドにセット--> <%= form.hidden_field :referer, value: flash[:referer] %> <%= form.submit 'ログイン' %> <% end %>

■事象
ログイン失敗ケース(authアクション、else内の処理)で@errorとして定義するメッセージが、render先で表示されない。

■調査状況
indexアクションで定義する@msgは正しくViewで表示される。
イメージ説明

またlogからelse内に入っていることがわかるが、画面が変わらない。
イメージ説明

Started POST "/login/auth" for 127.0.0.1 at 2022-03-13 08:51:24 +0900 Processing by LoginController#auth as TURBO_STREAM Parameters: {"authenticity_token"=>"[FILTERED]", "username"=>"aaaaa", "password"=>"[FILTERED]", "referer"=>"", "commit"=>"ログイン"} User Load (3.5ms) SELECT "users".* FROM "users" WHERE "users"."username" = ? LIMIT ? [["username", "aaaaa"], ["LIMIT", 1]] ↳ app/controllers/login_controller.rb:7:in `auth' @errorをセットしました。 Rendering layout layouts/application.html.erb Rendering login/index.html.erb within layouts/application Rendered login/index.html.erb within layouts/application (Duration: 28.9ms | Allocations: 171047) Rendered layout layouts/application.html.erb (Duration: 140.9ms | Allocations: 760213) Completed 200 OK in 210ms (Views: 157.6ms | ActiveRecord: 3.5ms | Allocations: 1165215)

分かる方、ご教示いただけると幸いです。
よろしくお願いいたします。

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

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

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

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

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

kobo_

2022/03/12 21:32 編集

調査状況を更新しました。
winterboum

2022/03/12 23:06

こういうのがぞうでなくtextで貼ってほしい。潰れて読みにくいし、検索もコピペもできない
kobo_

2022/03/12 23:53

失礼しました。ログをtextに更新しました。
guest

回答1

0

載っているcodeはうまく動かなかったものそのものですか? コピペするときに編集掛けてませんか?

codeの見た目からは 期待通りにうごくと思われます。
それが動かないとするとよくあるのは controller view どちらかの @errorの後ろに全角空白がついてる ってパターンですが
載っているcodeではそういうことではないので、冒頭の質問をしました。

追記
>またlogからelse内に入っていることがわかるが、画面が変わらない。
とありますが、そのlogをとったcode載せてください。ちとおかしい。
というのは auth に入ると @msg はどこでも定義されていないのに index で定義した値が表示されている。

ん? urlがおかしいな、inex になってますね。

投稿2022/03/12 13:48

編集2022/03/12 23:12
winterboum

総合スコア23329

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

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

kobo_

2022/03/12 21:33 編集

winterboumさん ありがとうございます。 コピペする際の編集はかけていません。動かないコードをそのまま載せています。 調査状況を更新しましたが、else内には入っているので、やはりView側で受け取れていないように見えます。 (log出力のコードは自身のローカルでのみ追加しました)
kobo_

2022/03/12 23:57

winterboumさん ありがとうございます。 質問内容のコード更新しました。以下コードが前回からの差分です。 >logger.debug('@errorをセットしました。') >ん? urlがおかしいな、inex になってますね。 inexになっていますか?ログ内検索しましたが、inexでヒットはしませんでした。 (キャプチャだったせいで潰れてたとかだったら、申し訳ないです) ご確認いただけると幸いです。
winterboum

2022/03/13 12:02

'@errorをセットしました。' を "@error =>#{@error}" にして中身を確認してみてください。 で、 「またlogからelse内に入っていることがわかるが、画面が変わらない。」の下の画面キャプチャーですが その URL欄が login/auth でなく login/indexになってるのが ??です
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問