Rails - 根据日期中的时间更改html元素

时间:2012-12-23 22:48:02

标签: ruby-on-rails ruby-on-rails-3 if-statement datepicker

好吧我的标题可能不是描述我正在尝试做什么的最佳方式,但一般来说,我如何根据时间量完成更改div的颜色(通过应用不同的css类)远离约会?

我正在使用它:

<%= todo.due ? todo.due.strftime("%b %d") : nil %>

显示截止日期。

它包含在一个div中,如果截止日期超过一周,距离今天或过期3天,我想更改该div的类别。

是否应该使用某些控制器逻辑来处理,或者视图中的else语句是否有效?

3 个答案:

答案 0 :(得分:3)

太容易了......

助手:

1)白天:

def style_by_daytime
  case Time.now.hour
  when (6..14) then "morning"
  when (14..20) then "daytime"
  when (20..23) then "evening"
  when (0..6) then "night"
  end
end

2)前一段时间

def style_by_days_gone(by_date)
  ago = (Date.today - by_date).round
  case ago
  when (1..7) then "week"
  when (8..14) then "two_weeks"
  when (15..30) then "month"
  when (31..180) then "several_months"
  else
    if ago > 180
      "many_time_ago"
    end  
  end
end

查看:

<% if todo.due %>
 <div class="<%= style_by_days_gone(todo.due) %>">
   <%= todo.due.strftime("%b %d") %>
 </div>
<% end %>

答案 1 :(得分:3)

您可以在帮助

中执行此操作
def css_select(due) 
  css_class = "passed" #=> deadline already passed
  days_due = (due - Date.today).to_i
  if days_due > 0
     css_class = case  days_due
                   when (0..3) then "threedays" #=> between 3 days
                   when (3..7) then "within7days" #=> between 7 days
                   else
                   "morethanweek" #=> more than a week
                end 
  end
  css_class
end

请注意,threedays, passed, within7days and morethanweek是您可能想要更改名称的css类。

这些是我做的测试

p css_select(Date.parse("2012-12-01")) #=> passed
p css_select(Date.parse("2012-12-25")) #=> with in 3 days
p css_select(Date.parse("2012-12-31")) #=> with in 7 days
p css_select(Date.parse("2013-01-10")) #=> more then 7 days

所以在你看来

<div class=<%= css_select(Date.parse(todo.due)) %>
  #your code goes here
</div>

所以,当你在视野中时,这个答案的灵感来自@Valery Kvon的答案givne

HTH

答案 2 :(得分:0)

您可以使用content_tag helper并提供自定义类值。类值可以放在帮助器中。

查看:

<%= content_tag :div, :class => todo_class(todo) do -%>
  <%= todo.title %>
<% end -%>

助手:

def todo_class(todo)
  if todo.due
    'due'
  ...
  end
end