如果Date.current.year
的{{1}}设置为@past_challenges,我想显示:deadline
。
Date.current.year
@past_challenges = current_user.challenges.order("deadline ASC").select{ |challenge| challenge.deadline < Date.current if challenge.deadline.present? }
@past_challenges_by_years = @past_challenges.group_by { |t| t.deadline.beginning_of_year }
以上不起作用,因为2016年是重复的。一旦作为<% if @past_challenges_by_years[Date.today.year] ||= [ ] %>
<h2>2016</h2>
<% end %>
的一部分而另一部分作为条件的一部分。我只希望条件触发group_by
对@past_challenges
== t.date :deadline
没有挑战。这意味着当年应该只有一个列表。
答案 0 :(得分:1)
我看到两个问题。一个是您按t.deadline.beginning_of_year
对问题进行分组,类似于2016-01-01 00:00:00 -0800
,然后使用Date.today.year
从您的哈希中提取,这只是2016
。您可以使用您喜欢的两种方法中的任何一种,只需要保持一致即可。我推荐.year
,因为它更简单,看起来更具语义性。
与此同时,@past_challenges_by_years[Date.today.year]
始终为nil
,然后是||= []
,让它始终为空数组并导致第二个问题:空数组是真的。现在您的支票总是通过,并且您总是会渲染2016年。您可以通过选中@past_challenges_by_years[Date.today.year].nil?
来查看是否有条目来修复现有代码,但如果您制作条目,则可以从视图中删除一些复杂性关于你的哈希的更多保证:
@past_challenges_by_years = Hash.new { |hash, key| hash[key] = [] }
@past_challenges.each { |c| @past_challenges_by_years[c.deadline.year] << c }
Hash.new
阻止确保每个查找的任何键都会使用空数组进行初始化,因此您不必担心nil
s所在的位置&# 39;不要他们。然后在您看来,您根本不需要检查当前年份的2016年条目或特殊情况,您只需呈现您想要的年份:
<%- 2016.downto(2010).each do |year| -%>
<h2><%= year %></h2>
<ul>
<%- @past_challenges_by_year[year].each do |challenge| -%>
<li><%= challenge.name %></li>
<%- end -%>
</ul>
<%- end -%>