ユーザーを導く機能!(゚∀゚)

処理が終わった後の「リダイレクト」と、安全・便利な「ヘルパー関数」を学ぼう!

1. 処理が終わったらご案内! (redirect_to)

Webアプリでは、データの保存や更新などの処理が終わった後、そのままの画面に留まることはあまりありません。
「保存しました!じゃあ一覧画面に戻りますねー」と、自動でページを切り替えるのが一般的ですね。みなさんもよく体験したことがあるかと思います(゜_゜)
これを「リダイレクト (redirect_to)」と呼びます。

リダイレクトって?

例えるなら「市役所の手続き完了後の誘導」です!(`・ω・´)
「転入届の提出(処理)」が終わったら、職員さん(Controller)が「はい、手続き完了です。次はあちらの待合室(別ページ)へどうぞー」と自動的に案内してくれるイメージです。
これがないと、お客さんは「えっ、終わったの?次どこ行けばいいの?(´;ω;`)」と迷子になってしまいます。

app/controllers/sample_controller.rb
# リダイレクトの処理の例
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 に書いてあります!
(すべてのページで共通して表示したいから、レイアウトファイルに書くのが定石なのです)

<% flash.each do |key, value| %>
  <!-- ここでメッセージを表示 -->
<% 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 に、トップページ("/")へリダイレクトするアクションを追加します。

my_controller.rb
class MyController < ApplicationController
  def page1
    # ... (既存のコード)
  end

  # ↓これを追加!
  def go_root
    # notice発砲
    flash[:notice] = "リダイレクト実行!((((((((っ・ω・)っ ブーン"
    # 「トップページへ移動せよ!」という命令
    redirect_to "/"
  end
end

2 Routesに「窓口」を追加

config/routes.rb に、新しいアクションへの道を作ります。

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 "/" が発動してトップに戻る仕組みです。