首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于#<Advertisement::ActiveRecord_Relation:0x007fe4cdd7df98>的未定义方法`total_pages‘

用于#<Advertisement::ActiveRecord_Relation:0x007fe4cdd7df98>的未定义方法`total_pages‘
EN

Stack Overflow用户
提问于 2017-07-30 11:05:04
回答 1查看 529关注 0票数 0

我正试着搜索标签,它运行得很好。但是,在我开始使用gem will_paginate进行分页之后,我无法这样做,因为我得到了这个错误:

代码语言:javascript
复制
undefined method 'total_pages' for #<Advertisement::ActiveRecord_Relation:0x007fe4cdd7df98>

但是,如果我搜索一个未知的标签,它可以正常工作(在索引页面上显示一个空的广告列表)。

advertisemts_controller.rb

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

我不知道如何解决这个问题,我正在使用ruby-2.3.4rails-5.1.2will_paginate-3.1

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-30 11:26:56

那是因为

代码语言:javascript
复制
def search_by_tag
  @advertisements = Advertisement.find_by_tags(tags_params)

  render 'advertisements/index'
end

不对关系调用paginate方法,而是呈现使用分页的视图。

您甚至可能注意到Advertisement.all.paginate(page: 1).total_pages可以工作,但是Advertisement.all.total_pages不起作用。

有点像

代码语言:javascript
复制
def search_by_tag
  @advertisements = Advertisement
    .find_by_tags(tags_params)
    .paginate(page: 1, per_page: 2)

  render 'advertisements/index'
end

应该解决这个问题

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45399139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档