循环记录时,根据当前年份创建条件?

时间:2016-03-05 18:32:04

标签: ruby-on-rails ruby date

如果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没有挑战。这意味着当年应该只有一个列表。

enter image description here

1 个答案:

答案 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 -%>