ユーザー名を表示させる
問題を出題されたすぐにapplication.html.erb
が表示されたのでここに書けばいいのか迷った。
それはusers_controller.rb
にインスタンス変数に代入させてそこでhtmlに表示されば良いのかどうかと考えたからだ。
結果users_controller.rb
に@userが入っていたのでこの名前のインスタンス変数を使えないので
htmlに直接書いた。
今思うと別の名前のインスタンス変数を作れば良かったかなと思った。
.
.
.
<ul class="header-menus">
<% if session[:user_id] %>
<li>
<%= link_to("#{User.find_by(id: session[:user_id]).name}", "users/#{User.find_by(id: session[:user_id]).id}" %>
</li>
.
.
.
なんか長くなった。
SyntaxError in HomeController#top
top
アクションの画面がこのリンクのせいで表示されないないことがわかるが、どういうふうにリンクが悪さをしているのかがわからない。
とりあえず
今さっき書いたリンクを消せばこのエラーを解消することがわかった。
リンクを書く。
リンクの名前とリンク先のパスを書かなければならない。
名前はいいとしてパスの書き方がわからない。
仮に
<%= link_to( "#{User.find_by(id: session[:user_id])}", "/users/1" %>
を書いてみた。
SyntaxError in HomeController#top
application.html.erb
のelseで止まってしまう。
どういうことだろうか?
解決法
<%= link_to( "#{User.find_by(id: session[:user_id])}", "/users/1")%>
()を閉じていなかったためだ。
そのため
elseまでlink_toに入っていたのでエラーになったと思われる。
リンク先を書いてみよう。
<%= link_to("#{User.find_by(id: session[:user_id].name)}", "/users/#{session[:user_id]}" )%>
こう書いてみた。
そうすると
ユーザー詳細画面の画像がおかしくなっていた。
どういうことだろう?
.
.
.
<img src="<%= "/user_images/#{@user.image_name}" %>">
.
.
.
で@userが呼び出されていないからだと思う。
ではusers_controller.rbのshowアクションを見てみよう。
def show
@user = User.find_by(id: params[:id])
end
しかしここでパスにidがあったはずなのでここで表示されないと思う。
わからない。次いこう。
ヒントを見るとbefore_action
が使われていた。
やっぱりインスタンス変数を使っていたか。
before_actionを使い共通処理を行わせる
ここでapplication.html.erb
で書いていたことを@current_userに代入させる。
またログイン中のユーザーを@current_user
と定義することを忘れていた。
applicationコントローラ
全てのコントローラで共通する処理はapplicationコントローラにまとめることができます。
図を見ると書くコントローラがアクションを起こす前にapplicationコントローラが作動し書くアクションが作動する。
そしてapplicationコントローラが定義した変数は各コントローラで使うことができる。
class ApplicationController < ActionController::Base
before_action :set_current_user
def set_current_user
@current_user = User.find_by(id: session[:user_id])
end
end
<ul class="header-menus">
<% if @current_user %>
<li>
<%= link_to(@current_user.name, "/users/#{@current_user.id}") %>
</li>