如何在一天中显示问候语

Wes*_*sly 1 ruby ruby-on-rails

我希望在一天之内显示一条问候语.如果是早上12点到早上11:59,我想要一个早上好的消息等等.这就是我所拥有但似乎无法让它发挥作用.

def greet
    if Time.now <= Time.now.beginning_of_day
        render :text =>"Good Morning"
    elsif Time.now <= Time.now.middle_of_day
        render :text => "Good Afternoon"
    elsif Time.now <= Time.now.change(:hour => 5 )
        render :text => "Good Evening"
    elsif Time.now <= Time.now.change(:hour => 8 )
        render :text =>"Good Night"
    end
end
Run Code Online (Sandbox Code Playgroud)

我会在我的观点中展示这样的东西.

<# This should display a greeting to the user %>
<%= greet %> <%= current_user.name %>
Run Code Online (Sandbox Code Playgroud)

kob*_*ltz 10

首先,让我们让时间更容易阅读.我根据您的条件设置了以下五个变量.我也将这些转换为纪元时间to_i

  current_time = Time.now.to_i
  midnight = Time.now.beginning_of_day.to_i
  noon = Time.now.middle_of_day.to_i
  five_pm = Time.now.change(:hour => 17 ).to_i
  eight_pm = Time.now.change(:hour => 20 ).to_i
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用if条件显示正确的文本(或者像您一样呈现).

  if midnight.upto(noon).include?(current_time)
    puts "Good Morning"
  elsif noon.upto(five_pm).include?(current_time)
    puts  "Good Afternoon"
  elsif five_pm.upto(eight_pm).include?(current_time)
    puts "Good Evening"
  elsif eight_pm.upto(midnight + 1.day).include?(current_time)
    puts "Good Night"
  end
Run Code Online (Sandbox Code Playgroud)

或者,您可以远离if陈述和使用case.

  case 
   when midnight.upto(noon).include?(current_time)
    puts "Good Morning"
   when noon.upto(five_pm).include?(current_time)
    puts  "Good Afternoon"
   when five_pm.upto(eight_pm).include?(current_time)
    puts "Good Evening"
   when eight_pm.upto(midnight + 1.day).include?(current_time)
    puts "Good Night"
  end
Run Code Online (Sandbox Code Playgroud)

就个人而言,你所做的是什么,但你并没有创造出界限的真实定义.虽然这可能不是什么大问题,但我确实希望设置明确的界限,以防万一有可能导致问题的事情发生.