前提・実現したいこと
現在、RailsでWebアプリケーションを作成しています。
Twitterのハッシュタグのように、そのタグをクリックしたらそのタグを保有している投稿だけ表示される機能を実装したのですが、その際にDRYな書き方ではなかったため、リファクタリングをしています。
そのリファクタリングをしている際にundefined method paginate for nil:NilClass
というエラーが発生しました。インスタンス変数@posts
が定義できていないことが原因だと思っています。やりたいこととしてはviewに@postsを渡して,指定されたタグを保有している投稿だけ表示したいです。
解決に向けて、お力を貸して頂ける方がいれば嬉しいです。
発生している問題・エラーメッセージ
NoMethodError in PostsController#index undefined method paginate for nil:NilClass
該当のソースコード
index.html.erb
Ruby
1 <% if params[:tag_name] %> 2 <p class="search_results"><span class="word"><%= "#{params[:tag_name]}" %></span>のタグがついた投稿</p> 3 <%= render @posts %> 4 5 <% elsif params[:area] %> 6 <p class="search_results"><span class="word"><%= "#{params[:area]}" %></span>の投稿</p> 7 <%= render @posts %> 8 9 <% elsif params[:genre] %> 10 <p class="search_results"><span class="word"><%= "#{params[:genre]}" %></span>の投稿</p> 11 <%= render @posts %> 12 13 <% elsif params[:season] %> 14 <p class="search_results"><span class="word"><%= "#{params[:season]}" %></span>の投稿</p> 15 <%= render @posts %> 16
posts_controller.rb
↓の記述を
Ruby
1#正常に動作はします 2 3 if params[:tag_name] 4 @posts = Post.tagged_with(params[:tag_name].to_s).paginate(page: params[:page], per_page: 5) 5 elsif params[:area] 6 @posts = Post.where(area: params[:area].to_s).paginate(page: params[:page], per_page: 5) 7 elsif params[:genre] 8 @posts = Post.where(genre: params[:genre].to_s).paginate(page: params[:page], per_page: 5) 9 elsif params[:season] 10 @posts = Post.where(season: params[:season].to_s).paginate(page: params[:page], per_page: 5) 11 end
↓に変えようとしています。
Ruby
1 key = params.keys.first 2 value = params.values.first 3 @posts = case key # ← ここで定義されない 4 when :tag_name 5 Post.tagged_with(params[:tag_name]) 6 when :area, :genre, :season 7 Post.where(key => values) 8 end.paginate(page: params[:page], per_page: 5)
試したこと
.paginate
を外してみると、'nil' is not an ActiveModel-compatible object. It must implement :to_partial_path.
というエラーになります。
補足情報(FW/ツールのバージョンなど)
ruby '2.6.6'
rails '6.0.3'
will_paginate 3.3.0
bootstrap-will_paginate 1.0.0
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。