0

私のeventsコントローラーには次のものがあります。

def index
  @event = Event.search(params[:search]).events_by_category(params[:cat]).order(...).paginate(...)
end

そして私のeventsモデルには、次のクラスメソッドがあります。

def self.events_by_category(cat)
  if cat == 0
    all
  elsif cat && cat != 0
    where('category = ?', cat)
  else
    scoped
  end
end

そして私の見解では、検索用の標準の検索ボックスとカテゴリ選択用のドロップダウンがあります。カテゴリoptions_for_selectには、それに含まれる配列があります["All Categories", 0]

私の質問は、ドロップダウンで[すべてのカテゴリ]が選択されているときに、すべての結果ではなく結果が返されないのはなぜですか。そして、配列をに変更する["All Categories", "ALL"]と、それにifステートメントがif cat == "ALL"返されますUndefined method 'order'か?

これは、コントローラーでsearchとevents_by_categoryをつなぎ合わせるのと関係があると思いますが、すべてのカテゴリーが選択されていない場合、検索とカテゴリーはうまく連携して機能します...

どんな助けでも大歓迎です!

4

2 に答える 2

2

最初に 2 番目の質問に答えるには: 問題は、cat == "ALL"条件が を返すことです。Event.allこれは RubyArrayであり、 ではありませんActiveRecord::Relationorder配列メソッドではなくアクティブレコードメソッドであるため、エラーが発生しますUndefined method 'order'

カテゴリのすべての結果を返したい場合は、(条件のないスコープを返しますALL) に変更allします。これは連鎖可能になるため、 andscopedで呼び出すことができます。orderpaginate

最初の質問に関しては、文字列なので、そうでないparams[:cat]かどうかを確認する必要があります。それが問題を解決するはずだと思います。cat == "0"cat == 0

ところで、あなたの条件は少し複雑です: 0 かどうかをテストcatし、else ステートメントで 0 でないことを確認していますが、それが 0 でないことは既にわかっています。メソッド コードを単純化することをお勧めします。これに:

def self.events_by_category(cat)
  (cat && cat != "0") ? where('category = ?', cat) : scoped
end

これは、カテゴリが存在し、存在しない場合"0"(つまり、「すべての結果」カテゴリではない場合)、そのカテゴリの結果を返し、そうでない場合はすべての結果を返します。

于 2012-12-11T04:41:59.630 に答える
0
def self.events_by_category(cat)
 if cat == "0"
   all
 elsif cat && cat != "0"
   where('category = ?', cat)
 else
   scoped
 end
end


上記は機能します。

于 2012-12-11T04:57:18.143 に答える