1. savaniased

    Posted

    savaniased
Changes in title
+rails 発展その3 ログイン機能のリンクについて
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,146 @@
+## ログインの有無 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行のプログラムだけで実現するもの
+
+