-1

以下は私のコントローラーコードです

class ProductComparisonController < ApplicationController

def product_vote
    if !session[:category_tracker]
        @categories = Category.where(:page_id => params[:page_id]).select(:id)
        session[:category_tracker]=@categories
        session[:step]=0
        session[:number_of_categories]=@categories.count
    end

    chosen_products = session[:category_tracker][session[:step]].chosen_product_ids
    @products = Product.where(:id => chosen_products).all
    session[:step] = session[:step] + 1

end

終わり

これを実行すると、カテゴリの最初のインスタンスに対して完全に実行されます。ただし、ステップ値が更新され、セッション変数から2番目の値をフェッチする必要がある場合は、エラーが発生します。

エラーは次のとおりです:(行11)

:@new_record:Symbolの未定義のメソッド `chosen_product_ids'

4

2 に答える 2

0

実際の配列ではなく、ActiveRecord::Relationをセッションに保存しています。

カテゴリフェッチの最後に.allを追加してみてください

于 2013-02-26T16:36:27.753 に答える
0

セッションに保存するには、リレーションを数値の配列に変換する必要があります。次に、現在のステップのIDに基づいてデータベースからオブジェクトをフェッチします。

class ProductComparisonController < ApplicationController

  def product_vote
    if !session[:category_tracker]
      # No need to use instance variables here.
      categories = Category.where(:page_id => params[:page_id]).select(:id)
      # Iterate the categories extracting only the ids.
      # select(:id) does not do this.
      session[:category_tracker] = categories.map(&:id)
      session[:step] = 0
      session[:number_of_categories] = categories.count
    end

    # First fetch the category
    category = Category.find(session[:category_tracker][session[:step]])
    # Then call methods on it
    chosen_products = category.chosen_product_ids
    @products = Product.where(:id => chosen_products).all
    session[:step] += 1
  end
end
于 2013-02-26T17:15:23.313 に答える