0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

rails5 progate 整理メモ

Posted at

ユーザー名を表示させる

問題を出題されたすぐにapplication.html.erbが表示されたのでここに書けばいいのか迷った。
それはusers_controller.rbにインスタンス変数に代入させてそこでhtmlに表示されば良いのかどうかと考えたからだ。
結果users_controller.rb@userが入っていたのでこの名前のインスタンス変数を使えないので
htmlに直接書いた。
今思うと別の名前のインスタンス変数を作れば良かったかなと思った。

application.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]}" )%>

こう書いてみた。
そうすると

ユーザー詳細画面の画像がおかしくなっていた。

どういうことだろう?

show.html
.
.
.
 <img src="<%= "/user_images/#{@user.image_name}" %>">
.
.
.

@userが呼び出されていないからだと思う。
ではusers_controller.rbのshowアクションを見てみよう。

users_controller.rb
  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コントローラが定義した変数は各コントローラで使うことができる。

application_controller.rb
class ApplicationController < ActionController::Base
  before_action :set_current_user

  def set_current_user
    @current_user = User.find_by(id: session[:user_id])
  end
end
application.html
      <ul class="header-menus">
        <% if @current_user %>
          <li>
            <%= link_to(@current_user.name, "/users/#{@current_user.id}") %>
          </li>
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?