生成昨天的URL日期

时间:2013-08-27 18:51:29

标签: ruby-on-rails ruby-on-rails-4

RoR新手在这里。我的应用程序将/year/month/day的任何请求路由到控制器,该控制器将日期解析为@date变量:

routes.rb中:

match "/:year/:month/:day", to: 'posts#index', via: 'get', :constraints => { :year => /\d{4}/, :month => /\d{2}/, :day => /\d{2}/ }, :as => 'post_date'

控制器:

if(params.has_key?(:year) && params.has_key?(:month) && params.has_key?(:day))
  @date = params[:year] + "-" + params[:month] + "-" + params[:day]
else
  @date = Date.today
end

我无法弄清楚如何使用可以链接到昨天的<%= link_to %>标签。明天的日期。例如,如果我正在访问http://example.com/2013/08/27,我希望在我的视图中有一个链接到昨天:http://example.com/2013/08/26和明天:http://example.com/2013/08/28

我尝试了几种不太优雅的解决方案,这些解决方案在某些方面都破裂了。什么是实现这个目标的好方法?

谢谢!

解决方案

它非常不优雅,但这是最终的解决方案:

控制器:

def index
    if(params.has_key?(:year) && params.has_key?(:month) && params.has_key?(:day))
        @date = Date.new(params[:year].to_i, params[:month].to_i, params[:day].to_i)
    else
        @date = Date.today
    end

    # Generate variables for yesterday
    @y_year = @date.yesterday.strftime("%Y")
    @y_month = @date.yesterday.strftime("%m")
    @y_day = @date.yesterday.strftime("%d")

    @formatted_date = @date.to_time.strftime("%B %e, %Y")
    @featured = Post.where(feature_date: @date).to_a

查看:

<%= link_to "Yesterday", post_date_path({ year: @y_year, month: @y_month, day: @y_day}) %>

2 个答案:

答案 0 :(得分:0)

一旦你设定了参考日期,你就可以做到:

#for yesterday
post_date_path({ year: @date.yesterday.year, month: @date.yesterday.month, day: @date.yesterday.day})

#for tomorrow
post_date_path({ year: @date.tomorrow.year, month: @date.tomorrow.month, day: @date.tomorrow.day})

在你的控制器中,我猜你宁愿:

@date = Date.new(params[:year], params[:month], params[:day] )

但是使用帮助器来抽象和重构它,会更清晰。

答案 1 :(得分:0)

我认为OP希望在URL上传递特定日期前一天

控制器

if(params.has_key?(:year) && params.has_key?(:month) && params.has_key?(:day))
  @date = Date.new(params[:year],params[:month],params[:day])
else
  @date = Date.today
end

查看

<%= link_to "Yesterday",'/#{@date.yesterday.year}/#{@date.yesterday.month}/#{@date.yesterday.day}' %>