2012-05-02 77 views
5

所以我有一个每周日历视图,并且我有一个路线设置为接受开始日期的/:年/月/日:。有日期的轨道路线

match "events/(:year/:month/:day)" => "events#index", 
     :constraints => { :year => /\d{4}/, :month => /\d{2}/, :day => /\d{2}/ }, 
     :as => "events_date" 

我对使用这条路线有两个问题。首先,在解析params时,这是我正在做的:

unless params[:year].nil? || params[:month].nil? || params[:day].nil? 
    start_date = Date.new(params[:year].to_i, params[:month].to_i, params[:day].to_i) 
end 
start_date = start_date.nil? ? Date.today : start_date 

这让我觉得很啰嗦,很丑陋。有没有更好的办法?

而且在日历制作时,链接到一个星期(分页一周一周),我必须这样做

#assume an date object with the desired start date 
link_to events_date_path(date.strftime('%Y'), date.strftime('%m'), date.strftime('%d')) 

这也似乎有点冗长和丑陋。处理路线中的日期的最佳方式是什么?

+0

是否有一个原因,它需要是人类可读的,并在这种格式?将它设置为匹配“events /(:date)”更合理吗?其中:date最终会变成“2012-05-01”,并且您可以将其直接strftime转换为真正的日期对象? –

+0

不,这是一个完全个人的项目,这是一个编程练习,因为它是一个真正的问题 – DVG

+0

我想我会把我的答案带到实际的答案领域,然后。 ;) –

回答

8

我的建议是不使用三个单独的变量。这样你就不会在控制器中出现很多额外的空检查和完整性检查。你仍然可以把你的比赛中的东西这个样子的,你的约束机智:

match "events/(:date)" => "events#index", 
     :constraints => { :date => /\d{4}-\d{2}-\d{2}/ }, 
     :as => "events_date" 

因此,你最终会得到的东西有点控制器更理智:

unless params[:date] 
    start_date = params[:date].strftime("%Y-%m-%d').to_date # assuming you want a Date 
end 

我通常做这些类型的“如果设置”检查更多的东西这样的,因为我觉得有点更具可读性:

start_date = Date.today unless defined? start_date 

你甚至可以滚动的最后两个在一起:

start_date = defined?(params[:date]) ? params[:date].strftime("%Y-%m-%d').to_date : Date.today 
+0

还请注意,您可以直接使用以下语法直接找到日期:Date.strptime(params [:date],'%Y-%m-%d') –

+0

感兴趣的点可以使用正斜杠的参数本身没有把部分分解成单独的变量? – DVG

+0

我不积极。我的猜测是肯定的,但我不会推荐它,因为它有点模棱两可。您的路线将显示为“events /(:date)”,并且您收到“events/2012/05/01”。在我看来,只是觉得有点肮脏,因为你应该在路线上分裂。 –