2012-12-06 22 views
0

我的項目中有很多資源。現在我想爲我所有的資源實現一個「daterange」函數。Rails休息呼籲幾個動作

例如:

/url/posts/daterange/datefrom-dateto/ 

/url/schedule/daterange/datefrom-dateto/ 

我可以寫在我想用它的每個控制器動作,但感覺就像在重複自己。

您將如何實施可以被所有類似操作使用的全局操作?

是路由的最好方法,或者我應該寫在application_controller

回答

1

我想你只是期待這個索引行動。爲此,您可以使用如果你想爲其他行動的config/routes.rb中

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

下,你可以在配置在routes.rb中

+0

謝謝,我會試試看 – jonasulveseth

1

我會用參數來代替路徑段,像/url/posts?datefrom=2012-12-05&dateto=2012-12-31的東西,因爲這會不會影響到路線,仍然是寧靜的。

然後,我想有下面的類宏:

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語句中,並且添加宏是你所需要做的。

希望我的回答可以告訴你一個可能的方向去哪裏。

+0

是的,我可以看到這是如何工作達到同樣的。但是如果可以的話,我想使用路徑段。由於Rails在獲取單個記錄等時使用路徑段,因此這將成爲前端開發人員使用該API的一種方式。 也許你可以映射全局的東西,聽/ controlller#action /:daterange /,然後從application_controller調用模塊或什麼? – jonasulveseth