будет разбит с Rails 5.1? - PullRequest
       70

будет разбит с Rails 5.1?

0 голосов
/ 14 декабря 2018

С момента обновления до Rails 5.1 я получаю следующую ошибку при попытке разбить на страницы нефильтрованные (но не отфильтрованные) результаты пользовательской таблицы:

will-paginate error

Я использую will-paginate 3.1.6 и Rails 5.1.0.Я даже не уверен, какая строка вызывает ошибку;предположительно, это строка

format.html { @members = @members.page(params[:page]); render }

, потому что прямо над ошибкой я вижу вызов базы данных, запрашивающий пользователей со смещением 25, предел 25.

Я даже пытался создать метод empty? для (стандартная модель ActiveRecord) User, но это приводит к появлению сообщения об ошибке, что это не строка.

Нужно ли изменить вызов на will_paginate?Нужна ли более ранняя версия will_paginate?Как заставить его работать с Rails 5.1?

EDIT: так заполняется @members:

@members = User.order("id DESC")
if current_user.admin_level < 8
    @members = @members.where("country = ?", current_user.country)
end

Ответы [ 4 ]

0 голосов
/ 31 января 2019

Измените строку, которая, по вашему мнению, вызывает проблему, из этого (в вашем контроллере):

format.html { @members = @members.page(params[:page]); render }

На это (если вы также используете JavaScript):

@members = Member.paginate(page: params[:page]).order("id DESC")
respond_to do |format|
  format.html
  format.js
end

Или вот это (если вы предпочитаете использовать оригинал):

format.html { @members = Member.paginate(page: params[:page]); render }

И, на ваш взгляд, попробуйте что-то вроде этого:

<% if current_user.admin_level < 8 %>
  <%= will_paginate @members.where("country = ?", current_user.country) %>
<% end %>
0 голосов
/ 31 января 2019

это, вероятно, не тот случай, но Я читал камень, о котором идет речь и, не должно ли это быть ...?:

format.html { @members = @members.paginate(page: params[:page]); render }
0 голосов
/ 31 января 2019

Скорее всего, ошибка возникает из-за того, что вы передаете один экземпляр User в page_entries_info вместо коллекции (вы не указали представление и все действие контроллера, поэтому трудно сказать)

Исполняемый пример ошибки может выглядеть так:

#!/usr/bin/env ruby
# frozen_string_literal: true

require "bundler/inline"

install = true
gemfile(install) do
  source "https://rubygems.org"
  gem "rails", "5.1.0"
  gem "will_paginate", '3.1.6'
  gem "sqlite3"
end

require "active_record"
require "action_controller/railtie"
require "will_paginate"
require "logger"
require "rack/test"

# we are skipping initializers so include manually:
require 'will_paginate/active_record'
require 'will_paginate/view_helpers/action_view'

ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
ActiveRecord::Schema.define do
  create_table :users, force: true do |t|
    t.string :country
  end
end

class User < ActiveRecord::Base
  self.per_page = 25
end

class TestApp < Rails::Application
  config.root = __dir__
  config.session_store :cookie_store, key: "cookie_store_key"
  secrets.secret_key_base = "secret_key_base"

  config.logger = Logger.new($stdout)
  ActiveRecord::Base.logger = config.logger
  Rails.logger  = config.logger

  routes.draw{ get "/" => "members#index" }
end

class MembersController < ActionController::Base
  include Rails.application.routes.url_helpers

  def index    
    @members = User.order("id DESC")
    @members = @members.page(params[:page])
    respond_to do |format|
      format.html{
        # passing single instance instead of collection:
        render inline: "<%= page_entries_info(@members.first) %>"
      }
    end
  end
end

require "minitest/autorun"

class BugTest < Minitest::Test
  include Rack::Test::Methods

  def test_returns_success
    User.create!
    get "/?page=1"
    assert last_response.ok?
    puts last_response.body
  end

  private
    def app
      Rails.application
    end
end
0 голосов
/ 28 января 2019

Я считаю, что вы должны изменить

@members = @members.page(params[:page])

на

@members = User.page(params[:page])

, но, конечно, это зависит от того, какое значение было установлено на @members.Если вы ранее установили @members для массива User s на основе некоторых критериев поиска, вам не следует создавать экземпляры User объектов, а вместо этого оставлять отношение в @members.

...