2017-07-30 2 views
0

Ich versuche, Tags zu suchen, und es funktionierte gut. Aber nachdem ich begann gem will_paginate für Paginierung zu verwenden, kann ich das nicht tun, weil ich diese Störung erhalte:undefined Methode `total_pages 'für # <Werbung :: ActiveRecord_Relation: 0x007fe4cdd7df98>

undefined method 'total_pages' for #<Advertisement::ActiveRecord_Relation:0x007fe4cdd7df98> 

Aber wenn ich nach einem unbekannten Tag zu suchen, es funktioniert (zeigt eine leere Liste von Anzeigen auf Index Seite).

advertisemts_controller.rb

class AdvertisementsController < ApplicationController 
    before_action :authenticate_user! 
    before_action :set_advertisement, only: %i[edit update destroy] 

    def index 
    @advertisements = Advertisement.paginate(page: params[:page], 
    per_page: 2) 
    end 

    def show 
    @advertisement = Advertisement.find(params[:id]) 
    end 

    def new 
    @advertisement = Advertisement.new 
    end 

    def create 
    @advertisement = Advertisements::Create.call(advertisement_params) 

    if @advertisement.errors.blank? 
     redirect_to advertisement_path(@advertisement), 
       notice: 'The advertisement was successfully added.' 
    else 
     render action: 'new' 
    end 
    end 

    def update 
    if @advertisement.update(advertisement_params) 
     redirect_to @advertisement, notice: 'Advertisement was 
              successfully updated.' 
    else 
     render :edit 
    end 
    end 

    def destroy 
    @advertisement.destroy 
    redirect_to advertisements_path, notice: 'Advertisement was 
    successfully destroyed.' 
    end 

    private 

    def set_advertisement 
    @advertisement = current_user.advertisements.find(params[:id]) 
    end 

    def advertisement_params 
    params 
     .require(:advertisement) 
     .permit(:title, :description, :user_id, :tags) 
     .merge(user_id: current_user.id) 
    end 
end 

search_queries_controller.rb

class SearchQueriesController < ApplicationController 
    def search_by_tag 
    @advertisements = Advertisement.find_by_tags(tags_params) 

    render 'advertisements/index' 
    end 

    private 

    def tags_params 
    params.fetch(:tags, '') 
    end 
end 

advertisement.rb

class Advertisement < ApplicationRecord 
    has_many :advertisement_tags, dependent: :destroy 
    has_many :comments 
    has_many :tags, through: :advertisement_tags 
    belongs_to :user 

    validates :title, 
      :description, 
      presence: true 

    def self.find_by_tags(tags) 
    Advertisement.joins(:tags).where('tags.tag_name IN (?)', 
             tags.split(/[\s,']/)) 
    end 
end 

Ich weiß nicht, wie dieses Problem zu lösen, ich bin mit ruby-2.3.4 und rails-5.1.2, will_paginate-3.1.

Antwort

0

Das ist, weil

def search_by_tag 
    @advertisements = Advertisement.find_by_tags(tags_params) 

    render 'advertisements/index' 
end 

nicht paginate Methode auf die Beziehung nicht nennen, aber macht die Ansicht, die Paginierung verwendet.

Sie können sogar bemerken, dass Advertisement.all.paginate(page: 1).total_pages funktioniert, aber Advertisement.all.total_pages nicht funktioniert.

So etwas wie

def search_by_tag 
    @advertisements = Advertisement 
    .find_by_tags(tags_params) 
    .paginate(page: 1, per_page: 2) 

    render 'advertisements/index' 
end 

sollte das Problem

+0

Sie beheben Dank! Es funktioniert jetzt gut –

Verwandte Themen