はじめに
この記事はチェックボックスタグ機能を付けている前提で進めています。まだつけていない方は以下の記事を参考に、実装してみて下さい。
【タグ機能完全版】 ~ Rails
目次
1.補足(一覧ページに投稿したタグを表示する方法)
2.ページネーションを付けている場合のエラー解決
それでは、始めていきましょう。
1.補足(一覧ページに投稿したタグを表示する方法)
index.html.erb のeach文の中に以下の記述を追加してください。
<% @tweets.each do |t| %>
#以下を追記
<% t.tags.each do |tag| %>
<%= tag.name %>
<% end %>
#ここまで
<% end %>
このように追加すれば、一覧ページに投稿したタグが表示されるはずです。もし表示されない場合やエラーが出る場合はアソシエーションやコントローラーのprivateメソッドへの記述やeach文で定義されている変数を使えているかなどを確認してみて下さい。
2.ページネーションを付けている場合のエラー解決
ページネーションを入れていない場合は、上記の記事通り実装すればエラーなくタグ検索できると思うので、こちらは飛ばして下さい。
しかし、ページネーションを入れている場合は、記事の通り実装してタグ検索すると、以下のようなエラーが出るはずです。今回はAND検索をメインに実装しています。OR検索の例も最後に記載しております。
これは、ページネーション関係のエラーですね。
ページネーションを導入したということは、コントローラーに以下のような編集を加える必要があります。burgerと書かれてるところは、自分用なので皆さんが作っているプロダクト用に変えてください。
def index
if params[:tag_ids]
@burgers = []
params[:tag_ids].each do |key, value|
if value == "1"
tag_burgers = Tag.find_by(name: key).burgers
@burgers = @burgers.empty? ? tag_burgers : @burgers & tag_burgers
end
#以下を追記
@burgers = @burgers.page(params[:page]).per(3)
#ここまで
end
end
end
今回は1つのページあたりに3つのツイートが表示されるようにしています。
このようにしてリロードすると、解決すると思いきやまた以下のような別のエラーが出てしまいました。
このエラーは以下の記事を参考にすると解決できました。
NoMethodError - undefined method `page' for #Array:0x000xxxxxx
こちらの記事の解決法に記載されている箇所を読めば、納得できると思います。したがって以下のように記述するとエラーは解決するはずです。
def index
if params[:tag_ids]
@burgers = []
params[:tag_ids].each do |key, value|
if value == "1"
tag_burgers = Tag.find_by(name: key).burgers
@burgers = @burgers.empty? ? tag_burgers : @burgers & tag_burgers
end
#以下を追記
@burgers = Kaminari.paginate_array(@burgers).page(params[:page]).per(3)
#ここまで
end
end
end
OR検索の場合も同様の考え方で以下のように追記すれば、実装できると思います。
def index
if params[:tag_ids]
@burgers = []
params[:tag_ids].each do |key, value|
@burgers += Tag.find_by(name: key).burgers if value == "1"
end
@burgers.uniq!
end
#以下を追記
@burgers = Kaminari.paginate_array(@burgers).page(params[:page]).per(3)
#ここまで
end
実装は以上になります。お疲れ様でした。
さいごに
最後まで読んでいただきありがとうございました。
ページネーションを付けた場合のチェックボックスタグ機能でのエラー解決に困っている方は、是非この記事を参考にしてもらえると嬉しいです。
また、間違いやその他意見など、ありましたらコメントいただけると幸いです。