3

2 つの名前付きスコープを持つイベント モデルがあります。

class Event < ActiveRecord::Base
  scope :future, lambda { where('events.date >= ?', Time.zone.now) }
  scope :past, lambda { where('events.date <= ?', Time.zone.now) }
end

2 つの新しいコントローラー アクション ("future" と "past" という名前) を作成して、コントローラーからこれらのスコープを呼び出します。

私のコントローラー:

class EventsController < InheritedResources::Base
  actions :index, :show, :future, :past

  has_scope :future
  has_scope :past

  def future
    index! { @events = Event.future }
  end

  def past
    index! { @events = Event.past }
  end
end

これらの追加アクションのビューとルートもあります。

これはうまくいきます。私のアプリケーションは私が望むことを行い、次のようにサイドバーで新しいアクションにリンクできます。

%li
  = link_to 'Events Home', events_path
%li
  = link_to 'Future Events', future_events_path
%li
  = link_to 'Past Events' past_events_path

この設定に関する私の問題は、問題なく動作しますが、これらの追加のスコープのために新しいアクション、ビュー、およびルートを作成する必要があるという事実が気に入らないことです。私はこれを正しい方法でやっているとは思わない。基本的に、インデックス ページで結果をフィルタリングしようとしていますが、これを行うには新しいアクション、ルート、ビューを作成する必要があります。ちょっと面倒くさいので、他に方法がないか検討中です。

「未来」と「過去」のコントローラー アクションを廃止し、次のようにビューからスコープを呼び出すだけでよいと思います。

%li
  = link_to 'Events Home', events_path
%li
  = link_to 'Future Events', events_path.future
%li
  = link_to 'Past Events' events_path.past

明らかにそれはうまくいきません。カスタム select_tag ヘルパーを使用する例を見てきましたが、select タグや JS なしで機能するようにかなり変更できます...

今のやり方を貫いた方がいいのか

4

2 に答える 2

5

index アクションのみを持ち、スコープをパラメーターとして渡すことができるので、次のようにします。

Event.send(params[:scope] : 'all')

スコープは次のように渡すことができます:

link_to "Future events", events_path(:scope => "future")
于 2010-09-08T07:10:58.000 に答える
4

外部パラメーターに基づいて send を使用するのは少し危険です。has_scope gemをお勧めします

于 2013-01-26T18:57:23.327 に答える