2012-12-06 20 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