3

モデルにMongoidクエリがあります

def self.get_result collection_name, hash_params, page, per_page 
  self.collection_name = collection_name
  @result_pg = self.where(hash_params).page(page).per(per_page)
end

コレクション名がパラメーターとして渡され、すべてのコレクションのモデルがないため、ここにあります。代わりに、1つのモデルがあり、リクエストパラメーターに基づいてその名前を動的に設定します。

私のコントローラーコード

Collection.get_result params[:state], hash_param, params[:page], params[:per]

マイビューコード

<%= paginate @result_pg %>

上記のコードを使用すると、

undefined method `current_page' for nil:NilClass   ERROR
4

1 に答える 1

4

モデルで呼び出すと、変数が失われていると思います。代わりに、次のようにオブジェクトを返してもらいます。

return self.where(hash_params).page(page).per(per_page) // put this in your model

次に、私はコントローラーです。ピースを接続します。

@result_pg = Collection.get_result params[:state], hash_param, params[:page], params[:per] 
// in your controller like so

現在、コントローラーは@result_pgを設定していません。そのため、コントローラーはnilであり、nilエラーが発生します。これを試して、それがうまくいったかどうか私に知らせてください。

更新しました

わかりました、これが起こる理由として。Railsがコントローラーをロードすると、@記号で宣言した変数が@bolognaビューに渡され、それらを使用して何かが実行されます。

一方、上記で投稿したソースコードに従って、コントローラーでその変数を技術的に宣言およびインスタンス化するのではなく、モデルで実行します。そこで変数を宣言することはできますが、コントローラーはそれが起こったことさえ知らないため、役に立ちません。クラスコレクションにメソッドを実行するように指示すると、通常、そのメソッドから何かが返されます。返さない場合、変数は失われます。

誰かに店に行って食料品を買うように頼むのと似ています。あなたは正しいことをし、メソッドに必要なすべての情報を与え、正しく仕事をするための正しい変数を渡しますが、実際には伝えませんそれらと一緒に戻ってきて、エラーが発生する場所です。あなたの方法では、食料品は店で購入され、そこに残されます。私があなたのために書いた改訂された関数は、食料品と一緒に戻ってそれらを変数に入れるように指示します@result_pg。変数は、想定どおりにコントローラーで宣言されます。

つまり、ビューでアクセスできるようにしたいものはすべて、コントローラーで宣言する必要があります。また、メソッドから何かを返したいときはいつでも、常に情報を返すようにしてください。

また、クラスコレクションへのメソッド呼び出しさえも完全に必要というわけではありません。カミナリを使用する私自身のプロジェクトでは、次のようにコントローラーから呼び出し全体を実行するだけです。

@notes = current_user.notes.page params[:page]
// My Application has :users that have_many :notes

したがって、必要に応じてそのように単純化することもできますが、私が提案した方法で修正することもできますが、どちらでもかまいません。

私の説明がお役に立てば幸いです。

于 2012-06-14T11:44:40.630 に答える