1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

チェックボックスタグ機能の補足と、ページネーションを付けた場合のエラー解決

Last updated at Posted at 2022-11-06

はじめに

この記事はチェックボックスタグ機能を付けている前提で進めています。まだつけていない方は以下の記事を参考に、実装してみて下さい。
【タグ機能完全版】 ~ Rails

目次
1.補足(一覧ページに投稿したタグを表示する方法)
2.ページネーションを付けている場合のエラー解決

それでは、始めていきましょう。

1.補足(一覧ページに投稿したタグを表示する方法)

index.html.erb のeach文の中に以下の記述を追加してください。

index.html.erb
<% @tweets.each do |t| %>
#以下を追記
    <% t.tags.each do |tag| %>
      <%= tag.name %>
    <% end %>
#ここまで
<% end %>

このように追加すれば、一覧ページに投稿したタグが表示されるはずです。もし表示されない場合やエラーが出る場合はアソシエーションやコントローラーのprivateメソッドへの記述やeach文で定義されている変数を使えているかなどを確認してみて下さい。

2.ページネーションを付けている場合のエラー解決

ページネーションを入れていない場合は、上記の記事通り実装すればエラーなくタグ検索できると思うので、こちらは飛ばして下さい。
しかし、ページネーションを入れている場合は、記事の通り実装してタグ検索すると、以下のようなエラーが出るはずです。今回はAND検索をメインに実装しています。OR検索の例も最後に記載しております。
タグ検索エラー1.png

これは、ページネーション関係のエラーですね。
ページネーションを導入したということは、コントローラーに以下のような編集を加える必要があります。burgerと書かれてるところは、自分用なので皆さんが作っているプロダクト用に変えてください。

burgers_controller.rb
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つのツイートが表示されるようにしています。
このようにしてリロードすると、解決すると思いきやまた以下のような別のエラーが出てしまいました。
タグ検索エラー2.png
このエラーは以下の記事を参考にすると解決できました。
NoMethodError - undefined method `page' for #Array:0x000xxxxxx
こちらの記事の解決法に記載されている箇所を読めば、納得できると思います。したがって以下のように記述するとエラーは解決するはずです。

burgers_controller.rb
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検索の場合も同様の考え方で以下のように追記すれば、実装できると思います。

burgers_controller.rb
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

実装は以上になります。お疲れ様でした。

さいごに

最後まで読んでいただきありがとうございました。
ページネーションを付けた場合のチェックボックスタグ機能でのエラー解決に困っている方は、是非この記事を参考にしてもらえると嬉しいです。
また、間違いやその他意見など、ありましたらコメントいただけると幸いです。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?