Ruby on rails を初心者向けに解説⑦　~フラッシュの実装~

#はじめに
今回は以前の記事の続きになります。

よろしければ、以前の記事も御覧ください。

今回はフラッシュについてまとめていきます。

[Ruby on rails を初心者向けに解説①](https://qiita.com/renesisu727/items/c81e29c619dbd4b5ea76)

[Ruby on rails を初心者向けに解説②　~リンクの作成~](https://qiita.com/renesisu727/items/d729616473981e763fdd)

[Ruby on rails を初心者向けに解説③　~データベースの作成~](https://qiita.com/renesisu727/items/c647582a59cfd7bf0a98)

[Ruby on rails を初心者向けに解説④ ~命名規則とform_Tagの使い方について~](https://qiita.com/renesisu727/items/f0f3de5377358f8768ed)

[Ruby on rails を初心者向けに解説⑤ ~データベースの編集と削除~](https://qiita.com/renesisu727/items/8f3a4b7c52c888b52be1)

[Ruby on rails を初心者向けに解説⑥　~バリデーションの作成~](https://qiita.com/renesisu727/items/cee8bbea1147ff78b72d)

#フラッシュとは
具体例を探しに、Twitterにで試してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411258/53c4983c-3bf2-e3a6-dce5-f92e249766e4.png)

この`入力されたユーザー名が～`の部分がフラッシュです。

フラッシュとはページ上に一度だけ表示されるものであり、ページを更新したり別のページに移動したりするとフラッシュは表示されなくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411258/ba6545db-42f9-04c1-f218-f108fa65ddb6.png)

このフラッシュを実装してみましょう。

#フラッシュの実装
railsでフラッシュを表示するためには、特殊な変数flashが用意されています。

アクションで変数`flash[:notice]`に文字列を代入すると、viewファイルで使用することができます。flashは一度使用された後は自動的に削除されることになっています。

また、フラッシュは色々な場所で共通して使用するので、`application.html.erb`ファイル内で使用すると便利です。

`application.html.erb`ファイルに書かれたものは、全てのviewファイルに共通して表示されるようになります。

views >> layoutsフォルダの配下にあるapplication.html.erbファイルに以下のように記入してフラッシュが表示できるようにしましょう。

```application.html.erb
<% if flash[:notice]%>
  <div class="flash">
    <%= flash[:notice]%>
  </div>
<% end %>
```

これで、フラッシュが存在するなら表示されるようになりました。

どうせなんで、cssも設定しておきましょう。

```application.css
.flash {
    background-color: brown;
    color: white;
}
```

postsコントローラーを次のように書き直して、`flash[:notice]`にエラーメッセージを代入してみましょう。

```posts_controller.rb
def create
  post = Post.new(content: params[:content])
  @content = params[:content]
  if post.save
    flash[:notice] = "投稿に成功しました"
    redirect_to("/posts/all")
  else
    flash[:notice] = post.errors.full_messages[0]
    render("posts/new")
  end
end
```

`post.save`の部分で失敗した場合に、`post.errors.full_messages`にエラーメッセージがリストとして格納されるため、その1つ目の値を`flash[:notice]`に格納しています。投稿に成功した場合は、その旨を`flash[:notice]`に格納します。

これでフラッシュを実装することができました。

実際に試してみましょう。

以下のnew.html.erbファイルを開いてみましょう。また、バリデーションは以下のようになっています。

```new.html.erb
<%= form_tag("/posts/create") do  %>  
  <textarea name="content" cols="30" rows="10"><%= @content%></textarea>
  <input type="submit" value="送信">
<% end %>
```

```post.rb
class Post < ApplicationRecord
    validates :content, {presence: true}
    validates :content, {length: {maximum: 20}}
end
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411258/a24211d2-1bff-b0b0-eb24-6b9ac0a6ad00.png)

試しに、値を何も入れずに送信を押してみましょう。バリデーションに弾かれ、エラーメッセージが`flash[:notice]`に格納されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411258/eef56ad6-d6de-5b39-743f-29dffae1940a.png)

次は、20文字以上入力して送信を押してみましょう。次のエラーメッセージが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411258/85144571-d78b-376d-e93d-3a7b26f15437.png)


今度は、投稿に成功した場合を試してみます。次のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411258/30e38a9a-65c3-3d0d-2a83-5818acf85175.png)

上手くいきましたね。

#終わりに
今回の記事はここまでになります。

お付き合い頂きありがとうございました。