LoginSignup
0
0

タグ検索(プルダウンバージョン)

Posted at

参考記事: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
0
0
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
0
0