我的项目中有很多资源。现在我想为我的所有资源实现“日期范围”功能。
示例:
/url/posts/daterange/datefrom-dateto/
/url/schedule/daterange/datefrom-dateto/
我可以在每个想要使用它的控制器中写一个动作但是感觉就像在重复自己。
如何实现可以被所有行为使用的全局动作?
路由是最好的方式还是我应该在application_controller
中写一些东西答案 0 :(得分: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语句中,并且您需要添加宏。
希望我的回答能告诉你一个可能的方向。
答案 1 :(得分:1)
我猜你只是希望单独使用索引操作。为此,您可以在config / routes.rb
中使用以下内容match '/(:controller)/(/daterange/(:datefrom)-(:dateto))(.:format)' => ':controller#index', :via => :get
如果您希望将其用于其他操作,则可以在routes.rb
中进行配置