【问题标题】:Rails routes with dates带日期的 Rails 路线
【发布时间】:2012-05-03 04:57:40
【问题描述】:

所以我有一个每周日历视图,并且我设置了一条路线以接受 /:year/:month/:day 作为开始日期。

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

关于这条路线的使用,我有两个问题。首先,在解析参数时,这就是我正在做的事情:

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'))

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

【问题讨论】:

  • 它是否需要人类可读,并且采用那种格式?将其设置为匹配 "events/(:date)" 是否更有意义,其中 :date 最终类似于 "2012-05-01",您可以直接将 strftime 设置为真实的日期对象?
  • 不,这是一个完全个人的项目,这既是一个编程练习,也是一个真正的问题
  • 我想我会把我的答案带到一个实际的答案字段中。 ;)

标签: ruby-on-rails-3 date routes


【解决方案1】:

我的建议是不要使用三个单独的变量。这样您就不会在控制器中进行大量额外的空值检查和健全性检查。你可以把你的比赛变成这样的样子,而你的约束仍然完好无损:

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

【讨论】:

  • 另请注意,您可以使用以下语法直接转到日期:Date.strptime(params[:date], '%Y-%m-%d')
  • 兴趣点,您可以在参数本身的一部分使用正斜杠而不将这些部分分解为单独的变量吗?
  • 我不积极。我的猜测是肯定的,但我不会推荐它,因为它有点模棱两可。您的路线将显示“events/(:date)”并且您正在接收“events/2012/05/01”。在我看来,这感觉有点脏,因为你应该在 / 的路线上分裂。
猜你喜欢
  • 1970-01-01
  • 2010-12-12
  • 2012-11-15
  • 1970-01-01
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
  • 2017-02-28
  • 2012-11-02
相关资源
最近更新 更多