質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.54%

  • Ruby on Rails

    8658questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • Ruby on Rails 4

    2535questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

  • RubyGems

    373questions

    RubyGemsはRubyによるプログラミングのためのパッケージマネジメントツールです。ユーザはこれを使用することで、Rubyライブラリのダウンロードやアップデートや、依存関係の自動解決が可能になります。

gem:kaminari のエラー:undefined method `total_pages'

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 4,283

innjera

score 114

ruby on railsにてkaminariを利用しpaginateしています。

通常は問題なく表示されているのですが、単純な検索機能であるsearchを実行すると、添付のエラーが出てしまいます。解決策わからず、ご教示頂けますと幸甚です。

イメージ説明

ログは以下の通りです。

ActionView::Template::Error (undefined method `total_pages' for #<Product::ActiveRecord_Relation:0x007f8da3a5c098>):
    78:   <!--paginationは全体でのみ表示(個人ページでは表示無し)-->
    79:   <div class="row">
    80:     <hr style="margin:0.5rem;">
    81:     <%= paginate @products %>
    82:     <hr style="margin:0.5rem;">
    83:   </div>
    84:   <!--pagination終わり-->

app/views/user/products/index.html.erb:81:in `_app_views_user_products_index_html_erb__1308523924954366777_70123156285140'
app/controllers/user/products_controller.rb:20:in `search'

 

#controller
class User::ProductsController < User::Base
  before_action :authenticate_user!, except:[:index, :show, :search]
  before_action :check_account

  def index
    if params[:user_id]
      @user = User.find(params[:user_id])
      @adviser = @user.adviser
      @products = @adviser.products
    else
      @products = Product.all
    end
    @products = @products.page(params[:page])
  end

  def search
    @products = Product.search(params[:q])
    render "index"
  end
end


searchmodelにて以下の通り定義しています。

class Product < ApplicationRecord
  class << self
    def search(query)
      rel = order("posted_at")
      if query.present?
        rel=rel.where(
        "title LIKE? OR parts LIKE? OR situation LIKE? OR makeupkit LIKE? OR makeupkit_explain LIKE? OR memo LIKE? OR place LIKE?",
        "%#{query}%", "%#{query}%", "%#{query}%", "%#{query}%", "%#{query}%", "%#{query}%", "%#{query}%"
        )
      end
      rel
    end
  end
end
#index.html.erb

<!--smart phone search-->
<div class="container">
  <div class="row">
    <div class="col-xs-12">
    <%= content_tag(:span, flash.notice) if flash.notice %>
    <%= content_tag(:span, flash.alert) if flash.alert %>
    <div>
  </div>

  <div class="row">
  <div class="hidden-md-up" style="height:3rem;">
    <%= form_tag :search_user_products, class: "col-sm-6 input-group ", method: :get do %>
    <%= text_field_tag "q", params[:q], class: "form-control", placeholder: "目元/チーク/ヘアアレンジ..."  %>
    <span class="input-group-btn">
      <%= submit_tag "Go!", class: "btn btn-secondary" %>
    </span>
    <% end %>
    <br>
  </div><!--hidden-md-up-->
  </div>

  <% if @user.present? && @user == current_user then %>
    <div class = "hidden-sm-down">
      <h4><%= @user.user_name + "さんの出品商品一覧" %>
      | <%= link_to "<i class='fa fa-heart'></i>".html_safe + "いいね!一覧", :voted_user_products %>
      | <%= link_to "<i class='fa fa-user'></i> ".html_safe + @user.user_name + "さんのアカウント", :user_account %>
      </h4>
      <%= link_to "レッスンを作る", new_user_user_product_path(current_user, @product), class: "btn bg-danger btn-block" %>
    </div><!--hidden-sm down-->
    <div class = "hidden-sm-up">
      <%= @user.user_name + "さんの出品商品一覧" %>
      <%= link_to "レッスンを作る", new_user_user_product_path(current_user, @product), class: "btn bg-danger btn-block" %>
    </div><!--hidden-sm-up-->
  <% end %>

  <!--lessones index-->
  <div class="row">
    <% @products.each do |p| %>
    <div class="col-sm-6 col-lg-4">
      <div class= 'card card-top-each'>
        <div class="card-block card-user-name">
          <%= user_icon_tag p.adviser.user, :alt => "icon-top", :class =>"icon-top" %>
          <%= p.adviser.user.user_name %><span style="font-size:0.5rem;">さん</span>
          <% if (count = p.votes.count) == 0 %>
          <span class="top-like">
            <i class="fa fa-heart-o" aria-hidden="true">&nbsp&nbsp</i>
          </span>
          <% elsif (count = p.votes.count) > 0 %>
          <span class="top-like">
            <i class='fa fa-heart'>&nbsp<%= count %></i>
          </span>
          <% end %>
        </div>

        <%= link_to [:user, p ], class:"card-link" do %>
        <div class= 'wwrapper' >
          <%= image_tag("make_1.jpg", :class => "card-image", :alt => "profile_image") %>
          <div class="card-img-overlay productimg">
            <p class="card-title productbrand"><%= p.title %><p>
          </div>
        </div>
        <div class="card-block card-block-for-tag">
          <span class="tag tag-warning"><%= p.parts %></span>
          <span class="tag tag-danger"><%= p.situation %></span>
          <span class="tag tag-success">アイライナー</span>
          <h6 class="p-price "><%= number_with_delimiter(p.price) %></h6>
          <h6 class="top-place"><%= p.place %></h6>
        </div><!--card-block-->
        <% end %><!--end of link_to-->

      </div><!--card-->
    </div><!--col-->
    <% end %>
  </div><!--row-->

  <!--pagination-->
  <div class="row">
    <hr style="margin:0.5rem;">
    <%= paginate @products %>
    <hr style="margin:0.5rem;">
  </div>
  <!--pagination終わり-->

</div><!--container-->
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

search actionに@products = @products.page(params[:page])を入れていないことが原因でした。
以下の通りsearch actionに追加することで解決しました。

def search
@products = Product.search(params[:q])
@products = @products.page(params[:page])
render "index"
end

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Ruby on Rails

    8658questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • Ruby on Rails 4

    2535questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

  • RubyGems

    373questions

    RubyGemsはRubyによるプログラミングのためのパッケージマネジメントツールです。ユーザはこれを使用することで、Rubyライブラリのダウンロードやアップデートや、依存関係の自動解決が可能になります。