rails 発展その3-1 ログイン機能のリンクについて
ログイン機能についての諸知識を2つに分けて投稿していきます。
ログインの有無-user_signed_in?
deviseの実装で使えるようになるメソッドでこれでログインしてるかしてないか
処理を分けることができます。
<% 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 %>
リンクの書き方
<%= link_to 'トップへ', '/home', class: 'sample' %>
ビューファイルとして読まれるとこうなります。
<a class="sample" href="/tweets">ホームへ</a>
prefix
Prefix(プレフィックス)とは、ルーティングパスの変数のことです。
コントローラ、ビューなどで呼び出すことで、prefixのパスやURL情報を取得できるようになります。
Prefixは、routes.rbの各リクエストにオプションとして設定しますが、
コードによっては自動作成される場合もあります。
確認方法は rake routesコマンドで確認できます。
#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とつける必要があります。
作成例はこちらです。
<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)
このままだとログインしてなくても投稿できてしまうので
ログインしてなかった場合送り返す処理コードが必要です。
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行のプログラムだけで実現するもの
Author And Source
この問題について(rails 発展その3-1 ログイン機能のリンクについて), 我々は、より多くの情報をここで見つけました https://qiita.com/savaniased/items/5a87241bb26573042519著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .