参考記事:https://qiita.com/yuuki-h/items/40d98847febbe0f81dfc
1.モデル作成
投稿テーブル:recruits(投稿モデル:Recruit)
タグに関するテーブル:tags(タグモデル:Tag)
投稿とタグを紐づける中間テーブル:recruit_tag_relations(中間モデル:Recruit_tag_relation)
・Tagモデル作成
コマンドプロンプト
rails g model Tag name:string
・Recruit_tag_relationモデルの作成
コマンドプロンプト
rails g model Recruit_tag_relation recruit:references tag:references
・データーベースに反映させる
コマンドプロンプト
rails db:migrate
2.モデルのアソシエーションの設定
recruit_tag_relation.rb
class RecruitTagRelation < ApplicationRecord
belongs_to :recruit
belongs_to :tag
end
recruit.rb
class Recruit < ApplicationRecord
# 以下を追記
#recruitsテーブルから中間テーブルに対する関連付け
has_many :recruit_tag_relations, dependent: :destroy
#recruitsテーブルから中間テーブルを介してTagsテーブルへの関連付け
has_many :tags, through: :recruit_tag_relations, dependent: :destroy
tag.rb
class Tag < ApplicationRecord
# 以下を追記
validates :name, presence: true
#Tagsテーブルから中間テーブルに対する関連付け
has_many :recruit_tag_relations, dependent: :destroy
#Tagsテーブルから中間テーブルを介してArticleテーブルへの関連付け
has_many :recruits, through: :recruit_tag_relations, dependent: :destroy
end
3.デフォルトのタグを追加する(タグ1、2のところは営業・マーケティング等自分が初期で設定したいタグを入れてね!)
db/seeds.rb
Tag.create([
{ name: 'タグ1' },
{ name: 'タグ2' },
{ name: 'タグ3' },
{ name: 'タグ4' },
{ name: 'タグ5' }
])
コマンドプロンプト
rails db:seed
4.投稿の際にタグを選択し、投稿できるようにする
recruits/new.html.erb
<%= form_for @recruit do |f| %>
#以下を追記
<div class='form-group'>
<%= f.collection_check_boxes(:tag_ids, Tag.all, :id, :name) do |tag| %>
<div class='form-check'>
<%= tag.label class: 'form-check-label' do %>
<%= tag.check_box class: 'form-check-input' %>
<%= tag.text %>
<% end %>
</div>
<% end %>
</div>
#ここまで
<%= f.submit "募集する" %>
<% end %>
5.コントローラーでタグの情報を受け取れるようにする
recruits_controller.rb
private
def recruit_params
params.require(:recruit).permit(:title,:job,:status, tag_ids: [])#, tag_ids: []を追加
end
end
6.詳細ページでタグを表示する(いらなかったら割愛しても大丈夫!)
recruits/show.html.erb
<% @recruit.tags.each do |tag| %>
<span><%= tag.name %></span>
<% end %>
7.タグをプルダウン形式で検索できるようにする
recruits/index.html.erb
<%= form_tag({controller:"recruits",action:"index"}, method: :get) do %>
<li><%= select_tag :tag_search, options_from_collection_for_select(@tag, "id","name") %></li>
<%= submit_tag '検索' %>
<% end %>
recruits_controller.rb
def index
if params[:search] != nil && params[:search] != ''
search = params[:search]
@recruits = Recruit.joins(:company).where("title LIKE ? OR name LIKE ?", "%#{search}%", "%#{search}%")
else
@recruits = Recruit.all
end
#以下を追記
@tag = Tag.select("name", "id")
tag_search = params[:tag_search]
if tag_search != nil
@recruits = Tag.find_by(id: tag_search).recruits
end
#ここまで
end
8.新たなタグを追加できるようにする
recruits/index.html.erb
<%= form_tag({controller:"recruits",action:"index"}, method: :get) do %>
<%= text_field_tag :tag %>
<%= submit_tag 'タグを追加' %>
<% end %>
recruits_controller.rb
def index
if params[:search] != nil && params[:search] != ''
search = params[:search]
@recruits = Recruit.joins(:company).where("title LIKE ? OR name LIKE ?", "%#{search}%", "%#{search}%")
else
@recruits = Recruit.all
end
@tag = Tag.select("name", "id")
tag_search = params[:tag_search]
if tag_search != nil
@recruits = Tag.find_by(id: tag_search).recruits
end
#以下を追記
if params[:tag]
Tag.create(name: params[:tag])
end
#ここまで
end