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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

3391閲覧

インスタンス変数が遷移時にnilになってしまう

Sigma1630

総合スコア36

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2019/03/01 13:38

編集2019/03/01 13:54

コントローラで生成した@userインスタンス変数が、リダイレクトした後に意図せず消えてしまいます。このインスタンス変数が遷移後も残るような解決策をご教示お願いします。

以下のloginアクションの中で@userを取得しています。
ログインフォームの値を受けて、その値をもつユーザーがusersテーブルから取得するイメージです。

ruby

1 def login 2 @user=User.find_by(email:params[:email],password:params[:password]) 3 if @user 4 session[:id] = @user.id 5 flash[:notice] = "ログインしました" 6 redirect_to("/") 7 else 8 render("users/login_form") 9 end 10 end

ここでリダイレクトされる"/"(トップページで)では以下のようなコードを記しています。

html

1<div class="main top-main"> 2 <div class="top-message"> 3 <h2><%= "idは#{session[:id]}です" %></h2> 4 </div> 5</div>

試しにid:1のユーザーが@userに取得されるようにしてloginアクションを実施します。
イメージ説明

意図通りの表示がされました。flashも表示されていることから@userが取得され、if @userを通った模様です。

ここでトップページのコードを以下のように変えます。session[:id]を@user.idにします。

html

1<div class="main top-main"> 2 <div class="top-message"> 3 <h2><%= "idは#{@user.id}です" %></h2> 4 </div> 5</div>

if @userが通ったことから確かに@userは存在するはずです。しかしloginアクションを実行すると以下のエラーがでます。

undefined method `id' for nil:NilClass

@userがnilで、それに対してidが使えないことを怒られています。

なぜ遷移時にloginアクション内では存在したはずの@userがnilになってしまうのでしょうか?もちろん遷移の過程で@userに変更が加わるルートは通っていないことを確認しています。

恐れ入りますが教えていただけますと幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

rootパスに紐づくcontroller#action内に @user のインスタンス変数が必要です。

例えば、 root to tweet#index なら

tweet_controller.rb def index @user = user.id end

などにするといいかと思います。

投稿2019/03/01 15:41

THitokuse

総合スコア49

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

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

Sigma1630

2019/03/01 16:51

ありがとうございます。アクションをまたいでインスタンス変数が使用できないことを知りました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問