0

rails 3.2.11 にアップデートした後、アプリの検索フォームに問題があることに気付きました。「申し訳ありませんが、問題が発生しました」を見た後。Heroku でメッセージが表示された場合、ログを確認したところ、次のエラー メッセージに気付きました。

NoMethodError (undefined method `to_i' for ["2010"]:Array):
app/controllers/skis_controller.rb:29:in `index'

これは、検索結果が表示されるインデックス コントローラーを参照しています。いくつかの collection_selects を含む実際の検索フォームの部分的な検索フォームを使用しています。

index アクションの 29 行目は、model_year (上記の検索では「2010」) を参照しています。collection_select から model_year フィールドを削除すると、すべて正常に動作します (検索後にエラー メッセージは表示されません)。これは、model_year collection_select がどのように見えるかです:

<%= collection_select(:ski, :model_year, @model_years.sort_by(&:model_year).reverse, :model_year, :model_year, {}, :multiple => true, :class => "chzn-select", :'data-placeholder' => "Enter Model Year") %>

過去 3 週間は問題なく動作していたので、これは私を悩ませています。私は最近 Rails 3.2.11 にアップデートしましたが、それがいつ問題が始まったのか確信が持てません (以前は気付かなかったことはわかっています)。collection_select のドキュメントをチェックアウトしましたが、すべて問題ないようです。

model_year は整数としてデータベースに格納されており、Rails コンソールでこれを確認しました。

どんな助けやアイデアも大歓迎です!ありがとう

編集 - コントローラーコードを追加するために更新:

def index

  @companies = Brand.scoped
  @ski_types = Ski.find(:all, :select => "DISTINCT ski_type")
  @genders = Ski.find(:all, :select => "DISTINCT gender")
  @names = Ski.find(:all, :select => "DISTINCT name")
  @price_ranges = PriceRange.scoped
  @model_years = Ski.find(:all, :select => "DISTINCT model_year")
  @sorts = ["Price", "Rating", "Availability"]

if params[:ski].present? || params[:brand].present? || params[:price_range].present?
# Creates references for collection select

  ski_type = params[:ski][:ski_type].reject(&:blank?)
  gender = params[:ski][:gender].reject(&:blank?)
  company = params[:brand][:company].reject(&:blank?)
  name = params[:ski][:name].reject(&:blank?)
  price_range = params[:price_range][:price_range]
  model_year = params[:ski][:model_year].reject(&:blank?)
  # raise ski_type.any?.inspect

  @ski = Ski.new
  @ski.ski_type = ski_type
  @ski.gender = gender
  @ski.name = name
  @ski.model_year = model_year

  @price_range = PriceRange.new
  @price_range.price_range = price_range

  @brand = Brand.new
  @brand.company = company

  skis = Inventory.search_price(price_range)

  skis_refined = Ski.search_characteristics(ski_type, gender, company, name, model_year)

  ski_ids2 = skis.map(&:id) & skis_refined.map(&:id)

  @all_skis = Ski.where(:id => ski_ids2)

  if params[:sort_by] == "Price Low to High"
    @overlapping_skis = Kaminari.paginate_array(@all_skis.joins(:inventories).order("inventories.price ASC").uniq_by(&:id)).page(params[:page]).per(30)
  elsif params[:sort_by] == "Price High to Low"
    @overlapping_skis = Kaminari.paginate_array(@all_skis.joins(:inventories).order("inventories.price DESC").uniq_by(&:id)).page(params[:page]).per(30)
  elsif params[:sort_by] == "Rating"
    @overlapping_skis = Kaminari.paginate_array(@all_skis.joins(:reviews).order("reviews.average_review DESC").uniq_by(&:id)).page(params[:page]).per(30)
  else
    @overlapping_skis = @all_skis.joins(:brand).order("brands.company ASC, skis.model_year DESC, skis.name ASC").page(params[:page])
  end

else
  @overlapping_skis = Ski.joins(:brand).order("brands.company ASC, skis.model_year DESC, skis.name ASC").page(params[:page])
end


respond_to do |format|
  format.html # index.html.erb
  format.json { render json: @skis }
end
end

検索方法の更新:

def self.search_characteristics(ski_type, gender, company, name, model_year)
@skis = Ski.scoped
if ski_type.any?
    @skis = @skis.where(:ski_type => ski_type)
end
if gender.any?
  @skis = @skis.where(:gender => gender)
end
if company.any?
  brand_object = Brand.where(:company => company)

  @id_array = brand_object.map(&:id)

  @skis = @skis.where(:brand_id => @id_array)
end
if name.any?
  @skis = @skis.where(:name => name)
end
if model_year.any?
  @skis = @skis.where(:model_year => model_year)
end
return @skis
 end
4

1 に答える 1

0

:multiple => trueこれは、model_year に複数の値を選択できることを意味します。これが配列である理由です。これらの複数の値を何らかの方法で処理するか、削除する必要があります:multiple => true

于 2013-01-15T21:15:29.417 に答える