Rails 4:在show view

时间:2015-10-19 16:36:48

标签: ruby-on-rails date ruby-on-rails-4 filter navigation

在我的Rails 4应用程序中,我有以下模型:

class Calendar < ActiveRecord::Base
  has_many :administrations
  has_many :users, through: :administrations
  has_many :posts
  has_many :comments, through: :posts
end

class Administration < ActiveRecord::Base
  belongs_to :user
  belongs_to :calendar
end

class Post < ActiveRecord::Base
  belongs_to :calendar
  has_many :comments
end

post个对象会显示其所属日历的Calendars#Show视图。

每封帖子都有:date个自定义属性(与:created_at默认属性不同)。

我想在Calendars#Show视图中实施导航,以便我按:date过滤帖子并逐月显示:

enter image description here

我已经开始实现如下:

calendars_controller.rb中,我有:

def show
    @user = current_user
    @calendar = @user.calendars.find(params[:id])
    @current_month = params[:month].blank? ? Date.today.month : params[:month].to_i
    @current_year = params[:year].blank? ? Date.today.year : params[:year].to_i
    if @current_month == 13
      @current_month = 1
      @current_year = @current_year + 1
    end
    if @current_month == 0
      @current_month = 12
      @current_year = @current_year - 1
    end
    @posts = @calendar
      .posts
      .includes(:comments)
      .where("Extract(month from date) = ?", @current_month)
      .where("Extract(year from date) = ?", @current_year)
      .order "date DESC"
    # authorize @calendar
  end

在Calendars show.html.erb文件中,我有:

<%= link_to '< Previous', calendar_path(@calendar, month: @current_month - 1) %>
<%= "#{Date::MONTHNAMES[@current_month]} #{@current_year}" %>
<%= link_to 'Next >', calendar_path(@calendar, month: @current_month + 1) %>

(然后我有一个显示相关帖子的循环)。

上述代码在本年度运作良好,即我可以每月导航,每个月都会获得正确的帖子。

然而,当我尝试导航到前一年(几次点击“&lt; Previous”按钮)或下一年(几次点击“&lt; Previous”按钮),然后两次事情发生了:

enter image description here

  • 月份序列从2015年1月至2014年12月至2015年11月(或2015年12月至2016年1月至2015年2月),意味着@current_year不再正确。
  • 因此(这实际上是查询运作良好的信号),我再次获得相同的帖子,因为我没有导航到2014年11月,而是去2015年11月,因此显示了2015年11月的帖子(相同2016年2月与2015年2月相关的问题。)

知道我的代码有什么问题吗?

1 个答案:

答案 0 :(得分:2)

我认为你也必须将@current_year传递给calendar_path。看起来这种情况总是将2015年定为当年。

@current_year = params[:year].blank? ? Date.today.year : params[:year].to_i

因为它适用于12月和1月的原因是因为您更改当月0 or 13时的当前年份

这应该有效

<%= link_to '< Previous', calendar_path(@calendar, month: @current_month - 1, year: @current_year) %>

<%= link_to 'Next >', calendar_path(@calendar, month: @current_month + 1, year: @current_year) %>