Rails 超簡単カテゴリー分け(投稿を分類)

#  はじめに
筆者は [大学生限定 プログラミングコミュニティ 『GeekSalon』](https://geek-salon.com/?utm_source=Direct&utm_medium=attract&utm_campaign=2Q&utm_content=Fukuoka_E_2Q)で活動している者です！ 
もし少しでも興味がありましたら、ぜひお話を聞きにきてくださいね♪

#  カテゴリー分けその１(Railsの基礎しか使いません)
イヌとネコとハダカデバネズミの投稿を分けたい人に向けて書いてみました！
解説は後ほど作ります多分。。
これ真似したらできます、ではさっそく
## コントローラー
```ruby:posts_controller.rb
#カテゴリー分けに関連するところのみ記載
  def dog
    @posts = Post.all
  end

  def cat
    @posts = Post.all
  end

  def hadakadebanezumi
    @posts = Post.all
  end
```

## ルート


```ruby:routes.rb
#カテゴリー分けに関係するところのみ記載
  get 'posts/dog' => 'posts#dog'
  get 'posts/cat' => 'posts#cat'
  get 'posts/hadakadebanezumi' => 'posts#hadakadebanezumi'
```
## それぞれのviewファイルを作成
viewのpostsディレクトリにdog.html.erbファイル,cat.html.erbファイル,hadakadebanezumi.html.erbファイルの三つを右クリックで作成

```erb:dog.html.erb
<h1>イヌのキモチ</h1>
#詳細は後で追記,ネコとハダカデバネズミも同様
```
## カテゴリー分けをするためにカラムを追加

```
$ rails g migration AddCategoryToPosts category:string
```
```
$ rails db:migrate
```
## コントローラー (ここお忘れなく！！)
```ruby:posts_controller.rb
# 忘れやすい！
 private
  def post_params
    params.require(:post).permit(:cotent,:category) #categoryを追加
  end
```

## 新規投稿ページ
プルダウンでcategoryカラムに特定のデータを送ってあげて三種類の動物たちを分類するための準備

```erb:new.html.erb

  <%= form_for @post do |f| %>
   <%= f.label :content,"内容" %>
   <%= f.text_field :content %>
   <%= f.select :category, [["イヌ", "dog"], ["ネコ", "cat"], ["ハダカデバネズミ", "hadakadebanezumi"]], include_blank: "どの投稿？" %>
   <%= f.submit "投稿する" %>
  <% end %>
```

## viewページ
if文だけで分類する

```erb:dog.html.erb
<h1>イヌのキモチ</h1>
<% @posts.each do |t| %>
  <% if t.category == "dog" %>  #ここがポイント！ categoryカラムにdogと格納されているものだけを表示している！
  <p>内容:<%= t.content %></p>
  <% end %>
<% end %>
```
```erb:cat.html.erb
<h1>ネコのキモチ</h1>
<% @posts.each do |t| %>
  <% if t.category == "cat" %>  #ここがポイント！ categoryカラムにcatと格納されているものだけを表示している！
  <p>内容:<%= t.content %></p>
  <% end %>
<% end %>
```
```erb:hadakadebanezumi.html.erb
<h1>ハダカデバネズミのキモチ</h1>
<% @posts.each do |t| %>
  <% if t.category == "hadakadebanezumi" %>  #ここがポイント！ categoryカラムにhadakadebanezumiと格納されているものだけを表示している！
  <p>内容:<%= t.content %></p>
  <% end %>
<% end %>
```

おしまい♪

#  カテゴリー分けその2 (ちょっと進歩？)
その１とほとんど同じですが、whereメソッドを使ってイヌとネコとハダカデバネズミの投稿を分けます。
コントローラーを見ただけで何をしているのかがわかるのでこちらの方がスマートかなあと思います。

## ルート (その１と同じ)


```ruby:routes.rb
#カテゴリー分けに関係するところのみ記載
  get 'posts/dog' => 'posts#dog'
  get 'posts/cat' => 'posts#cat'
  get 'posts/hadakadebanezumi' => 'posts#hadakadebanezumi'
```
## それぞれのviewファイルを作成 (その１と同じ)
viewのpostsディレクトリにdog.html.erbファイル,cat.html.erbファイル,hadakadebanezumi.html.erbファイルの三つを右クリックで作成

```erb:dog.html.erb
<h1>イヌのキモチ</h1>
#詳細は後で追記,ネコとハダカデバネズミも同様
```
## カテゴリー分けをするためにカラムを追加 (その１と同じ)

```
$ rails g migration AddCategoryToPosts category:string
```
```
$ rails db:migrate
```
## 新規投稿ページ (その１と同じ)
プルダウンでcategoryカラムに特定のデータを送ってあげて三種類の動物たちを分類するための準備

```erb:new.html.erb

  <%= form_for @post do |f| %>
   <%= f.label :content,"内容" %>
   <%= f.text_field :content %>
   <%= f.select :category, [["イヌ", "dog"], ["ネコ", "cat"], ["ハダカデバネズミ", "hadakadebanezumi"]], include_blank: "どの投稿？" %>
   <%= f.submit "投稿する" %>
  <% end %>
```
## コントローラー (ここが変わります！)
```ruby:posts_controller.rb
#カテゴリー分けに関連するところのみ記載
  def dog
    @dogs = Post.where(category:"dog") #ここがポイント！categoryのバリューがdogの投稿を取得！
  end

  def cat
    @cats = Post.where(category:"cat") #ここがポイント！categoryのバリューがcatの投稿を取得！
  end

  def hadakadebanezumi
    @hadakadebanezumis = Post.where(category:"hadakadebanezumi") #ここがポイント！categoryのバリューがhadakadebanezumiの投稿を取得！
  end

 private
  def post_params
    params.require(:post).permit(:cotent,:category) #categoryを追加
  end
```
## viewページ (コントローラーを変えたので当然ここも変わります)
あとはwhereメソッドで取得したやつを表示するだけです

```erb:dog.html.erb
<h1>イヌのキモチ</h1>
<% @dogs.each do |t| %>
  <p>内容:<%= t.content %></p>
<% end %>
```
```erb:cat.html.erb
<h1>ネコのキモチ</h1>
<% @cats.each do |t| %>
  <p>内容:<%= t.content %></p>
<% end %>
```
```erb:hadakadebanezumi.html.erb
<h1>ハダカデバネズミのキモチ</h1>
<% @hadakadebanezumis.each do |t| %>
  <p>内容:<%= t.content %></p>
<% end %>
```

おしまい♪

#  カテゴリー分けその3 (さっきまでのとはちょっと違います)

カテゴリーによって保存したいカラムが違う場合がありますよね？^^

今回はカテゴリーごとに入力ページを変えたい...!!って人向けに書いてみます。


※以下では、記録サイト(読書記録、勉強記録、書籍購入記録の3つのカテゴリー)を作りたい人を例としています。

(newアクションたるものを複数個作ってもできると思いますが、、、)

## コントローラー
```ruby:posts_controller.rb

  def new
    @post = Post.new
    @category = params[:category] #これ追記
  end
```
## ルート


```ruby:routes.rb

  get 'posts/new/:category' => 'posts#new'
```
## リンク
```erb:index.html.erb
<%= link_to "読書記録", "/posts/new/reading" %>
<%= link_to "勉強記録", "/posts/new/study" %>
<%= link_to "書籍購入記録", "/posts/new/purchase" %>
```
## 新規投稿ページ
if文でカテゴリーごとの入力ページを作りやす

```erb:new.html.erb
<%= @category %>
 <% if @category=="reading" %>                  # ーーーーーーーーー
   <%= form_for @post do |f| %>
     <%= f.label :title,"本のタイトル" %>
     <%= f.text_field :title %><br>
     <%= f.label :author,"著者" %>
     <%= f.text_field :author %><br>             #読書記録
      <%= f.label :image,"写真" %>
      <%= f.file_field :image %><br>
     <%= f.label :bookcontent,"内容" %>
     <%= f.text_field :bookcontent %><br>
     <%= f.submit "投稿する" %>
   <% end %>                                    # ーーーーーーーーー
 <% elsif @category=="study" %>                 # ーーーーーーーーー
   <%= form_for @post do |f| %>
     <%= f.label :subject,"教科" %>
     <%= f.text_field :subject %><br>            #勉強記録
     <%= f.label :studycontent,"勉強内容" %>
     <%= f.text_field :studycontent %><br>
     <%= f.submit "投稿する" %>
   <% end %>                                    # ーーーーーーーーー
 <% elsif @category=="purchase" %>              # ーーーーーーーーー
   <%= form_for @post do |f| %>
     <%= f.label :what,"購入品" %>
     <%= f.text_field :what %><br>  　           #書籍購入記録
     <%= f.label :howmuch,"いくらした？" %>
     <%= f.text_field :howmuch %><br>
     <%= f.submit "投稿する" %>
   <% end %>                                    #ーーーーーーーーー
 <% end %>
```
ここまでで1つのnewページでカテゴリーごとの入力フォームが完成しました！！

カテゴリーごとの入力ページはできたものの、これでは、その１、その2のようにプルダウンでカテゴリー分けをするためのカラムにデータを送っていないからそれぞれの記録のviewページが作れない!?!?

## カテゴリー分けをするためにカラムを追加 (その１とやっていることは同じです)
categoryって言いすぎてうんざりしてきそう(入力ページを分けているcategoryたちと混同して何してるか分からなくなっちゃいそう)なので、気分転換にカテゴリー分けをするために新たなカラム(yamamotochotaカラム)を追加しやーす！

```
$ rails g migration AddYamamotochotaToPosts yamamotochota:string
```
```
$ rails db:migrate
```
```ruby:posts_controller.rb
# お忘れなく
 private
  def post_params
    params.require(:post).permit(:title,:author,...,:yamamotochota) #yamamotochotaを追加
  end
```

## 新規投稿ページ (カテゴリー分けするためのデータを送るお)
hidden_fieldというのを使って、データを送ります。
読んで字の如く、隠れた入力フォームです。
送信ボタンを押すと指定したカラムに指定した値を送ります。
隠れてこそこそしている山本チョタさんにぴったりですね！

```erb:new.html.erb
 <h1>新規<%= @category %>投稿 </h1>
 <% if @category=="reading" %>
   <%= form_for @post do |f| %>
     <%= f.label :title,"タイトル" %>
     <%= f.text_field :title %><br>
     <%= f.label :author,"著者" %>
     <%= f.text_field :author %><br>
      <%= f.label :image,"写真" %>
      <%= f.file_field :image %><br>
     <%= f.label :bookcontent,"内容" %>
     <%= f.text_field :bookcontent %><br>
     <%= f.hidden_field :yamamotochota, :value =>"reading" %> #ここを追記しました
     <%= f.submit "投稿する" %>
   <% end %>
 <% elsif @category=="study" %>
   <%= form_for @post do |f| %>
     <%= f.label :subject,"教科" %>
     <%= f.text_field :subject %><br>
     <%= f.label :studycontent,"勉強内容" %>
     <%= f.text_field :studycontent %><br>
     <%= f.hidden_field :yamamotochota, :value =>"study" %> #ここを追記しました
     <%= f.submit "投稿する" %>
   <% end %>
 <% elsif @category=="purchase" %>
   <%= form_for @post do |f| %>
     <%= f.label :what,"購入品" %>
     <%= f.text_field :what %><br>
     <%= f.label :howmuch,"いくらした？" %>
     <%= f.text_field :howmuch %><br>
     <%= f.hidden_field :yamamotochota, :value =>"purchase" %> #ここを追記しました
     <%= f.submit "投稿する" %>
   <% end %>
 <% end %>
```
残りのルート、コントローラー、ビューはカテゴリー分けその1、２と同じやり方でできます...！

投稿一覧もその３と同じようにすれば一つのアクションにまとめられる...!?

##  参考までに同一ページに投稿を分類して表示してみる
その１、２でやってることとほっとんどおんなじです。


```ruby:posts_controller.rb

  def index
    @reading = Post.where(yamamotochota:"reading")
    @study = Post.where(yamamotochota:"study")
    @purchase = Post.where(yamamotochota:"purchase")
  end
```

```ruby:routes.rb

  get 'posts/index' => 'posts#index'
```
```erb:index.html.erb
<%= link_to "新規読書記録へ", "/posts/new/reading" %>
<%= link_to "新規勉強記録へ", "/posts/new/study" %>
<%= link_to "新規書籍購入記録へ", "/posts/new/purchase" %>

<h1>読書記録一覧</h1>
　<% @reading.each do |t| %>
    <p>タイトル:<%= t.title %></p>
    <p>著者:<%= t.author %></p>
    <p>写真:</p>
    <%= image_tag t.image_url, size: "250x200" if t.image? %>
    <p>内容:<%= t.bookcontent %></p>
　<% end %>

<h1>勉強記録一覧</h1>
　<% @study.each do |t| %>
  　<p>教科:<%= t.subject %></p>
  　<p>内容:<%= t.studycontent %></p>
　<% end %>
<h1>書籍購入記録一覧</h1>
　<% @purchase.each do |t| %>
  　<p>購入書籍:<%= t.what %></p>
  　<p>値段:<%= t.howmuch %></p>
　<% end %>
```
こんな感じどす。だいぶ汚いと思いますが、おしまい♪

##  最後に
初めての記事&&プログラミング歴浅い ということもあり、わかりにくいし汚いしもっといいやり方があると思います。
今回はちょっと自分で考えてコードを書けるようになったのでその記念に記事にしてみました！
少しでも役に立てれば幸いです m(_ _)m

他のカテゴリー分けのサイトを見てみてもっと賢い人たちのやり方を学んで随時新たな記事にチャレンジしてみようと思いまする。
ここまで読んでくださった方、ありがとうございました。また来てくだせえ！
修正補足、アドバイス等ございましたら、どしどしお願い致します m(_ _)m