rails 発展その3-1 ログイン機能のリンクについて

ログイン機能についての諸知識を2つに分けて投稿していきます。

## ログインの有無-user_signed_in?
deviseの実装で使えるようになるメソッドでこれでログインしてるかしてないか
処理を分けることができます。

```html:index.html.erb
   <% if user_signed_in? %>
         <!-- ログインしている時 -->
        <div class="user_nav grid-6">
          <%= link_to "ログアウト", destroy_user_session_path, method: :delete %>
          <a class="post" href="/tweets/new">投稿する</a>
        </div>
   <% else %>
　　　　　<!-- ログインしていない時 -->
        <div class="grid-6">
          <%= link_to "ログイン", new_user_session_path, class: 'post' %>
          <%= link_to "新規登録", new_user_registration_path, class: 'post' %>
        </div>
   <% end %>
```

## リンクの書き方

```html:html
    <%= link_to 'トップへ', '/home', class: 'sample' %>
　　
　　　ビューファイルとして読まれるとこうなります。
　　　<a class="sample" href="/tweets">ホームへ</a>
　
```

## prefix
　Prefix(プレフィックス)とは、ルーティングパスの変数のことです。
　コントローラ、ビューなどで呼び出すことで、prefixのパスやURL情報を取得できるようになります。
　Prefixは、routes.rbの各リクエストにオプションとして設定しますが、
　コードによっては自動作成される場合もあります。

 確認方法は rake routesコマンドで確認できます。

```bash:ターミナル
#rake routesコマンドの実行
$rake routes
#実行結果

                  Prefix Verb   URI Pattern                    Controller#Action
        new_user_session GET    /users/sign_in(.:format)       devise/sessions#new
            user_session POST   /users/sign_in(.:format)       devise/sessions#create
    destroy_user_session DELETE /users/sign_out(.:format)      devise/sessions#destroy
           user_password POST   /users/password(.:format)      devise/passwords#create
       new_user_password GET    /users/password/new(.:format)  devise/passwords#new
      edit_user_password GET    /users/password/edit(.:format) devise/passwords#edit
                         PATCH  /users/password(.:format)      devise/passwords#update
                         PUT    /users/password(.:format)      devise/passwords#update
cancel_user_registration GET    /users/cancel(.:format)        devise/registrations#cancel
       user_registration POST   /users(.:format)               devise/registrations#create
   new_user_registration GET    /users/sign_up(.:format)       devise/registrations#new
  edit_user_registration GET    /users/edit(.:format)          devise/registrations#edit
                         PATCH  /users(.:format)               devise/registrations#update
                         PUT    /users(.:format)               devise/registrations#update
                         DELETE /users(.:format)               devise/registrations#destroy
                    root GET    /                              tweets#index
              tweets_new GET    /tweets/new(.:format)          tweets#new
                  tweets POST   /tweets(.:format)              tweets#create
                         GET    /users/:id(.:format)           users#show
                         DELETE /tweets/:id(.:format)          tweets#destroy
                         GET    /tweets/:id/edit(.:format)     tweets#edit
                         PATCH  /tweets/:id(.:format)     
　　
```

簡単な表にするとこんな形です。

| リクエスト                | prefix | path |
|:-:|:-:|:-:|
|devise/sessions#new    |new_user_session       |/users/sign_in   |
|devise/sessions#destroy|destroy_user_session   |/users/sign_in   |
|devise/sessions#create |user_session           |/users/sign_out   |

prefixを利用する場合は、destroy_user_session_pathのように、最後に_pathとつける必要があります。

作成例はこちらです。

```html:ターミナル
  <header class="header">
    <div class="header__bar row">
      <h1 class="grid-6"><a href="/">PicTweet</a></h1>

      <!-- ログイン有無のメソッド -->
      <% if user_signed_in? %>

        <!-- ログインしている時 -->
        <div class="user_nav grid-6">
        <!-- ここでpathとmethodを定義しています。 -->
          <%= link_to "ログアウト", destroy_user_session_path, method: :delete %>
          <a class="post" href="/home/new">投稿する</a>
        </div>

      <% else %>

        <!-- ログインしていない時 -->
        <div class="grid-6">
　　     <!-- ここでpathとmethodを定義しています。 -->
          <%= link_to "ログイン", new_user_session_path, class: 'post' %>
          <%= link_to "新規登録", new_user_registration_path, class: 'post' %>
        </div>
      <% end %>

    </div>
  </header>
```

##リダイレクト処理(before_actionとunless)

このままだとログインしてなくても投稿できてしまうので
ログインしてなかった場合送り返す処理コードが必要です。

```ruby:controller

    class TweetsController < ApplicationController

    before_action :move_index, except: :index
    # index以外のリクエストがあった時実行

    #(省略)

    def move_index
      redirect_to action: :index unless user_signed_in?
    end

   # ログインしてない時indexに送り返す処理を強制的に実行する
```

**before_action**
　コントローラのアクションが実行される前に
　そのメソッドを実行することができます
　又　exceptでそれ以外
　　　onlyでそれのみの実行になります。
**redirect_to**
　redirect_toメソッドをアクション内で利用すると
　そこからさらに別のアクションを実行したり、ビューに遷移させたりできます。
**unless ワンライナー**
　unlessでfalseの時に実行されます。
　
　又ワンライナーとは
　たった1行のプログラムだけで実現するもの