我的項目中有很多資源。現在我想爲我所有的資源實現一個「daterange」函數。Rails休息呼籲幾個動作
例如:
/url/posts/daterange/datefrom-dateto/
/url/schedule/daterange/datefrom-dateto/
我可以寫在我想用它的每個控制器動作,但感覺就像在重複自己。
您將如何實施可以被所有類似操作使用的全局操作?
是路由的最好方法,或者我應該寫在application_controller
我的項目中有很多資源。現在我想爲我所有的資源實現一個「daterange」函數。Rails休息呼籲幾個動作
例如:
/url/posts/daterange/datefrom-dateto/
/url/schedule/daterange/datefrom-dateto/
我可以寫在我想用它的每個控制器動作,但感覺就像在重複自己。
您將如何實施可以被所有類似操作使用的全局操作?
是路由的最好方法,或者我應該寫在application_controller
我想你只是期待這個索引行動。爲此,您可以使用如果你想爲其他行動的config/routes.rb中
match '/(:controller)/(/daterange/(:datefrom)-(:dateto))(.:format)' => ':controller#index', :via => :get
下,你可以在配置在routes.rb中
我會用參數來代替路徑段,像/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語句中,並且添加宏是你所需要做的。
希望我的回答可以告訴你一個可能的方向去哪裏。
是的,我可以看到這是如何工作達到同樣的。但是如果可以的話,我想使用路徑段。由於Rails在獲取單個記錄等時使用路徑段,因此這將成爲前端開發人員使用該API的一種方式。 也許你可以映射全局的東西,聽/ controlller#action /:daterange /,然後從application_controller調用模塊或什麼? – jonasulveseth
謝謝,我會試試看 – jonasulveseth