LoginSignup
4
5

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-02-07

はじめに

筆者は 大学生限定 プログラミングコミュニティ 『GeekSalon』で活動している者です!
もし少しでも興味がありましたら、ぜひお話を聞きにきてくださいね♪

カテゴリー分けその1(Railsの基礎しか使いません)

イヌとネコとハダカデバネズミの投稿を分けたい人に向けて書いてみました!
解説は後ほど作ります多分。。
これ真似したらできます、ではさっそく

コントローラー

posts_controller.rb
#カテゴリー分けに関連するところのみ記載
  def dog
    @posts = Post.all
  end

  def cat
    @posts = Post.all
  end

  def hadakadebanezumi
    @posts = Post.all
  end

ルート

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ファイルの三つを右クリックで作成

dog.html.erb
<h1>イヌのキモチ</h1>
#詳細は後で追記,ネコとハダカデバネズミも同様

カテゴリー分けをするためにカラムを追加

$ rails g migration AddCategoryToPosts category:string
$ rails db:migrate

コントローラー (ここお忘れなく!!)

posts_controller.rb
# 忘れやすい!
 private
  def post_params
    params.require(:post).permit(:cotent,:category) #categoryを追加
  end

新規投稿ページ

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

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文だけで分類する

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

おしまい♪

カテゴリー分けその2 (ちょっと進歩?)

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

ルート (その1と同じ)

routes.rb
#カテゴリー分けに関係するところのみ記載
  get 'posts/dog' => 'posts#dog'
  get 'posts/cat' => 'posts#cat'
  get 'posts/hadakadebanezumi' => 'posts#hadakadebanezumi'

それぞれのviewファイルを作成 (その1と同じ)

viewのpostsディレクトリにdog.html.erbファイル,cat.html.erbファイル,hadakadebanezumi.html.erbファイルの三つを右クリックで作成

dog.html.erb
<h1>イヌのキモチ</h1>
#詳細は後で追記,ネコとハダカデバネズミも同様

カテゴリー分けをするためにカラムを追加 (その1と同じ)

$ rails g migration AddCategoryToPosts category:string
$ rails db:migrate

新規投稿ページ (その1と同じ)

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

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 %>

コントローラー (ここが変わります!)

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メソッドで取得したやつを表示するだけです

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

おしまい♪

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

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

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

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

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

コントローラー

posts_controller.rb

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

ルート

routes.rb

  get 'posts/new/:category' => 'posts#new'

リンク

index.html.erb
<%= link_to "読書記録", "/posts/new/reading" %>
<%= link_to "勉強記録", "/posts/new/study" %>
<%= link_to "書籍購入記録", "/posts/new/purchase" %>

新規投稿ページ

if文でカテゴリーごとの入力ページを作りやす

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ページでカテゴリーごとの入力フォームが完成しました!!

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

カテゴリー分けをするためにカラムを追加 (その1とやっていることは同じです)

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

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

新規投稿ページ (カテゴリー分けするためのデータを送るお)

hidden_fieldというのを使って、データを送ります。
読んで字の如く、隠れた入力フォームです。
送信ボタンを押すと指定したカラムに指定した値を送ります。
隠れてこそこそしている山本チョタさんにぴったりですね!

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、2と同じやり方でできます...!

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

参考までに同一ページに投稿を分類して表示してみる

その1、2でやってることとほっとんどおんなじです。

posts_controller.rb

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

  get 'posts/index' => 'posts#index'
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

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5