3

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

何か案は?ありがとう!

編集

の後に使用されるブロックを削除することで、機能させることができfindます。order_byまた、未定義のメソッド呼び出しを取得していたため、squirrel プラグインで使用されるを移動する必要がありました。

conditions複数の場所で使用する必要があるため、これが以前のコードよりも DRY ではないという事実は気に入りません。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

このエラーの別の可能性は、Rails 2.2.2 で Ruby 1.8.7 を使用していて、現在 Rails 2.3.5 で Ruby 1.9.1 を使用している可能性があります。1.8.7 と 1.9.1 の間で、ActiveRecord の検出後にブロックが実行されないようにする大きな変更はありましたか?

4

1 に答える 1

1

Rails 2.3.5では、find(:all、...)呼び出しは配列を返します。通常、これらには、スコープで取得するようなカスタムメソッドが関連付けられていません。検索呼び出しにブロックを渡すことも少し不規則であり、問​​題の一部である可能性があります。

必要なものを見つけるスコープを作成することで、これを修正できる場合があります。

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

次に、代わりにスコープを使用できます。

@routes = Route.with_ids(params[:id])
于 2010-05-17T15:56:33.857 に答える