Неопределенный метод total_entries после обновления Rails 2.2.2 до 2.3.5 - PullRequest
3 голосов
/ 17 мая 2010

Я обновляю приложение Rails с 2.2.2 до 2.3.5. Единственная оставшаяся ошибка - это когда я вызываю total_entries для создания jqgrid.

Ошибка:

NoMethodError (undefined method `total_entries' for #<Array:0xbbe9ab0>)

Фрагмент кода:

@route = Route.find(
  :all,
  :conditions => "id in (#{params[:id]})"
) {
  if params[:page].present? then
    paginate :page => params[:page], :per_page => params[:rows]
    order_by "#{params[:sidx]} #{params[:sord]}"
  end
}

respond_to do |format|
  format.html # show.html.erb
  format.xml  { render :xml => @route }
  format.json  { render :json => @route }
  format.jgrid {
    render :json => @route.to_jqgrid_json(
      [
        :id, :name
      ],
      params[:page],
      params[:rows],
      @route.total_entries
    )
  }
end

Есть идеи? Спасибо!

EDIT

Я могу заставить его работать, удалив блок, использованный после find. Мне также пришлось переместить order_by, используемый плагином squirrel, поскольку я получал неопределенный вызов метода для него.

Мне не нравится тот факт, что это менее СУХОЙ, чем предыдущий код, из-за необходимости использовать conditions в более чем одном месте. Есть ли лучший способ сделать это с Rails 2.3.5, will_paginate и squirrel?

  if params[:page].present? then
    @route = Route.paginate :conditions => "id in (#{params[:id]})", :page => params[:page], :per_page => params[:rows], :order => "`#{params[:sidx]}` #{params[:sord]}"
  else
    @route = Route.find(:all, :conditions => "id in (#{params[:id]})")
  end

РЕДАКТИРОВАТЬ 2

Другая возможность для этой ошибки может заключаться в том, что я использовал Ruby 1.8.7 с Rails 2.2.2 и теперь использую Ruby 1.9.1 с Rails 2.3.5. Были ли какие-либо серьезные изменения между 1.8.7 и 1.9.1, которые могли бы помешать блоку после того, как ActiveRecord обнаружил, что он не работает?

1 Ответ

1 голос
/ 17 мая 2010

В Rails 2.3.5 вызов find (: all, ...) возвращает массив, и, как правило, с ними не связано никаких пользовательских методов, как вы можете получить с областью действия. Передача блока вызову find также немного нерегулярна и может быть частью проблемы.

Вы можете исправить это, создав область, которая найдет то, что вы хотите:

class Route < ActiveRecord::Base
  named_scope :with_ids, lambda { |*ids| {
    :conditions => { :id => ids.flatten }
  }}
end

Тогда вы можете использовать область вместо:

@routes = Route.with_ids(params[:id])
...