LoginSignup
0
0

More than 3 years have passed since last update.

【Railsメモ】content_forを用いて、条件に応じてページ内容を切り替える

Last updated at Posted at 2019-09-07

例えば以下ようなページがあったとします。
2e7fa6cde6fd23f0f0fec49cb831e78e.png

右側にはユーザ情報として、"アイコン""名前"が表示されます。
これを
・ログイン時
→自分の情報

・非ログイン時
→新規登録案内

・各ユーザのプロフィールユーザページ
そのユーザの情報

この三種類に切り替えたい場合の実装方法です。

ログイン時と非ログイン時であれば、ユーザがログインかどうかを判断して条件分岐させるだけですが、このように特定状況下で各ユーザの情報を入れたいとなると、content_forを使うのが良いようです。

例えば、このサイトの場合views内にあるusers/show.html.erb(各ユーザの名前やアイコンを表示する)では、routesで設定したURL内に含まれるIDを取得し、ユーザを特定しています。 ところが、非ログイン時はもちろん、URLにIDが設定されていないviewsからユーザを特定する事は出来ません。 その為ユーザを特定できない状況ならばヘルパーで設定したcurrent_userにて、現在ログインしているユーザの情報に切り替えて表示しようというわけなのです。各 <%= render 'users/users_deta' %> を見てもらえればわかりますが、各条件分岐にて与える変数を変えています。 (@userがURLから取得したユーザ、current_userがヘルパーで設定した現在ログインしているユーザです)

<% if content_for?(:side_user) && logged_in? %> にて、ページにside_user変数があり、かつユーザがログインしているかどうかを判定しています。

application.html.erb
<!-- 各ユーザのプロフィールユーザページ-->

<!-- そのユーザの情報 -->
<% if content_for?(:side_user) && logged_in? %>
  <%= render 'users/users_deta', user: @user %>

<!-- ログイン時 -->
<% elsif logged_in? %>
  <%= render 'users/users_deta', user: current_user %>

<!-- 非ログイン時 -->
<% else %>
  <!-- 非ログイン時の新規登録案内 -->
  <div class="nologin_top_image">
    <div class="nologin_top_text">
      <h2 class="text-white">DopeArtworksへようこそ!</h2>
      <div class="button_follow">
        <%= link_to '新規登録', signup_path, class: 'btn btn-lg btn-primary' %>
      </div>
    </div>
  </div>
<% end %>

では、一番目の条件分岐を実行したい場合です。
これは実に単純で実行させたいviewsページ内に <% provide :side_user, "side_user" %> (変数(:左)及び与える文字列("右")は各自で変えてください) を記述するだけです。

今回はcontent_forを使う経緯まで説明しましたが、重要なのは
if content_for?(:変数)

provide :変数, "文字列"
です。

つまり、if content_for?(:変数)で同じ:変数が各ページにあるかを判定し、好きなviewsにて記述したprovide :変数, "文字列" にて"文字列":変数に代入され、条件分岐で指定したものと同じであれば、プログラムが実行されるわけです。

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