ユーザーを導く機能!(゚∀゚)
処理が終わった後の「リダイレクト」と、安全・便利な「ヘルパー関数」を学ぼう!
1. 処理が終わったらご案内! (redirect_to)
Webアプリでは、データの保存や更新などの処理が終わった後、そのままの画面に留まることはあまりありません。
「保存しました!じゃあ一覧画面に戻りますねー」と、自動でページを切り替えるのが一般的ですね。みなさんもよく体験したことがあるかと思います(゜_゜)
これを「リダイレクト (redirect_to)」と呼びます。
リダイレクトって?
例えるなら「市役所の手続き完了後の誘導」です!(`・ω・´)
「転入届の提出(処理)」が終わったら、職員さん(Controller)が「はい、手続き完了です。次はあちらの待合室(別ページ)へどうぞー」と自動的に案内してくれるイメージです。
これがないと、お客さんは「えっ、終わったの?次どこ行けばいいの?(´;ω;`)」と迷子になってしまいます。
# リダイレクトの処理の例
def create
# (ここでデータを保存する処理...)
# 処理が終わったら、一覧ページ("/posts/index")へ飛ばす!
redirect_to "/posts/index"
end
4の実践演習で実際にリダイレクトを実装してみましょう(o・ω・o)
2. 一瞬だけ表示するメッセージ (Flash)
リダイレクトした直後、「保存しました!」とか「削除しました」って画面の上に一瞬だけ出ますよね?
あれをRailsでは「フラッシュメッセージ (flash)」と呼びます。
フラッシュメッセージって?
例えるなら「すれ違いざまの伝言」です!( ゚д゚)ハッ!
ページを移動するその一瞬だけ、「上手くいきましたよ!」と書かれたメモを渡すようなものです。
次のページを表示したら(またはリロードしたら)、そのメモはシュレッダーにかけられて消えてしまいます。儚いですね...。
使い方は簡単!
Controllerで flash[:notice] という特別な箱にメッセージを入れるだけです。
def create
# 保存処理...
# フラッシュメッセージをセット
flash[:notice] = "記事を保存しました!(゚∀゚)"
redirect_to "/posts/index"
end
表示する仕掛けは、実はもう application.html.erb に書いてあります!
(すべてのページで共通して表示したいから、レイアウトファイルに書くのが定石なのです)
<!-- ここでメッセージを表示 -->
<% end %>
3. HTMLを書くより便利!ヘルパー関数
Railsには、HTMLタグをRubyのコードで簡単に書ける「ヘルパー関数」がたくさん用意されています。
特に link_to(リンク)と image_tag(画像)は超頻出です!
リンクを作る (link_to)
HTML (面倒くさい...)
<a href="/users/1">マイページ</a>
Rails (スッキリ!)
<%= link_to "マイページ", "/users/1" %>
画像を表示 (image_tag)
HTML (パス間違えそう...)
<img src="/assets/cat.png" />
Rails (ファイル名だけでOK!)
<%= image_tag "cat.png" %>
なんでわざわざヘルパーを使うの?
「HTML直接書いたほうが早くない?」と思うかもしれません。
でも、ヘルパーを使う最大の理由は「セキュリティ対策」です!(`・ω・´)
もし悪い人が、掲示板の名前に <script>alert('ウイルスだぞ!')</script> なんて登録したとします。
HTMLでそのまま表示すると、そのスクリプトが実行されてしまいます(危険!)。
しかし!Railsのヘルパーは、自動的に危険な文字を「ただの文字」に無害化(エスケープ)してくれます。
例えるなら「食材(データ)を調理する前に、必ず消毒・殺菌してくれるフィルター」が通るようなものです。
だからRailsを使うだけで、自然と安全なサイトが作れるんですねー(*‘ω‘ *)ナルホド
4. 実践演習:トップへ戻る処理を作ろう!(`・ω・´)
これまでの知識(Controller, Routes, Redirect, Helper, Flash)を総動員して、
「ボタンを押したらトップページへ戻る」という機能を実装してみましょう!
1 Controllerに「案内係」を追加
app/controllers/my_controller.rb に、トップページ("/")へリダイレクトするアクションを追加します。
class MyController < ApplicationController
def page1
# ... (既存のコード)
end
# ↓これを追加!
def go_root
# notice発砲
flash[:notice] = "リダイレクト実行!((((((((っ・ω・)っ ブーン"
# 「トップページへ移動せよ!」という命令
redirect_to "/"
end
end
2 Routesに「窓口」を追加
config/routes.rb に、新しいアクションへの道を作ります。
Rails.application.routes.draw do
# ... (既存のコード)
# ↓これを追加!
get "my/go_root"
end
3 動作確認!
サーバーを起動して、ブラウザで /my/go_root にアクセスしてみましょう。
一瞬でトップページに戻されれば成功です!(゚∀゚)
Ex [応用] ボタンを作ってみよう!
前回の「Bootstrap」と今回の「link_to」を組み合わせれば、おしゃれなボタンが作れます。
app/views/my/page1.html.erb などに以下のコードを貼ってみてください。
<%# classにBootstrapの装飾を指定しています %>
<%= link_to "トップに戻る", "/my/go_root", class: "btn btn-primary" %>
※ /my/go_root にアクセスすると、コントローラの redirect_to "/" が発動してトップに戻る仕組みです。