0

私のプロジェクトにはたくさんのリソースがあります。ここで、すべてのリソースに「daterange」関数を実装したいと思います。

例:

/url/posts/daterange/datefrom-dateto/

/url/schedule/daterange/datefrom-dateto/

使いたいコントローラーごとにアクションを書くこともできますが、それは自分を繰り返しているような気がします。

そのようなすべてのアクションで使用できるグローバルアクションをどのように実装しますか?

ルーティングが最善の方法ですか、それともapplication_controllerに何かを書く必要があります

4

2 に答える 2

1

のようなパスセグメントの代わりにパラメーターを使用します/url/posts?datefrom=2012-12-05&dateto=2012-12-31。これは、ルートに影響を与えず、RESTfulであるためです。

次に、次のクラスマクロが必要です。

class PostsController < ApplicationController
  allows_query_by_daterange
  #...
end

そしてミックスイン:

module QueryByDateRange
  def allows_query_by_daterange
    include QueryByDateRange::Filter
  end

  module Filter
    extend ActiveSupport::Concern
    included do
      before_filter :apply_daterange  # maybe only on the index action?
    end

    def apply_daterange
      # set @datefrom and @dateto from params
    end
  end
end

すべてのコントローラーで使用できるようにします。

class ApplicationController
  extend QueryByDateRange
end

アクションでは、少なくともインスタンス変数が設定されています。このソリューションはさらに推進される可能性があり、条件がARelステートメントに自動的に追加され、マクロを追加するだけで済みます。

うまくいけば、私の答えはあなたに行くべき可能な方向を示すことができます。

于 2012-12-06T10:36:29.337 に答える
1

インデックスアクションだけでこれを期待していると思います。このために、config/routes.rbで以下を使用できます

match '/(:controller)/(/daterange/(:datefrom)-(:dateto))(.:format)' => ':controller#index', :via => :get

他のアクションで必要な場合は、routes.rbでの構成でも同じことができます。

于 2012-12-06T11:06:10.757 に答える