【问题标题】:Method to render how many days remain in membership - Ruby on Rails渲染会员资格剩余天数的方法 - Ruby on Rails
【发布时间】:2016-06-01 22:04:20
【问题描述】:

目前我有一个名为 expiration_date 的方法,它调用 created_at 并将该日期增加 1 年。我现在想创建一个方法,基本上说明距离expiration_date 还剩多少天,并在视图上调用它。为了清楚起见,我将展示我的模型代码,希望这会更有意义。

型号

class Subscriber < ActiveRecord::Base
  validates :first_name, presence: true
  validates :last_name, presence: true
  validates :email, presence: true
  validates :phone_number, presence: true

  def date_joined
   created_at.strftime("%-m/%-d/%-y")
  end

  def expiration_date
   (created_at + 1.year).strftime("%-m/%-d/%-y")
  end

  def days_till_expired
    #code
  end
end

控制器

class SubscribersController < ApplicationController
  def index
    @subscriber = Subscriber.all
  end

  def new
    @subscriber = Subscriber.new
  end

  def create
    @subscriber = Subscriber.create(subscriber_params)
    if @subscriber.save
      flash[:notice] = "Subscriber Has Been Successfully Created"
      redirect_to new_subscriber_path(:subscriber)
    else
      render "new"
    end
  end

  def search
    @subscriber = Subscriber.new
  end

  def visit
    @subscriber = Subscriber.find_by_phone_number(params[:phone_number])
    if @subscriber
      @subscriber.visit =+ 1
      @subscriber.save
      redirect_to subscribers_search_path(:subscriber)
    else
      render "search"
    end
  end
end

我有一个视图表单,用户可以在其中输入他们的电话号码,它会闪现通知以告知他们还剩多少时间。我认为我需要在发送时获取他们的电话号码的用户参数。这有意义吗?

【问题讨论】:

标签: ruby-on-rails ruby


【解决方案1】:

这个怎么样

def days_till_expiration
  ((created_at + 1.year) - DateTime.now).to_i / 1.day
end

【讨论】:

  • 这很好用,但它是浮点数据类型。你知道我怎样才能把它改成 int 吗?
  • 已在上面更新...如果您想以不同方式舍入,请更改
  • 仅供参考,我认为您不应该使用到期日期来依赖于创建日期。它应该是您可能第一次分配的数据库中的一个字段。您可以相应地更新此方法 =)
  • 感谢@Abdo!只是为了清楚,到期日期应该是它的现场?
  • @CameronBass 当然。您希望以后能够扩展它,不是吗?所以它必须有自己的字段:-)
【解决方案2】:

基本上,您只想获取created_at + 1.year 和今天日期之间的天数(您可以通过Date.today 获得)。如果您创建date1 - date2,它将返回 date1 和 date2 之间的天数。

请注意(正如这里提到的How can I find the number of days between two Date objects in Ruby?),从 Ruby 2.1.3 开始,日期的差异返回一个 Rational。所以你得到(5/1) 而不是5。要解决这个问题,只需使用to_i。如果您使用的 Ruby 版本早于 2.1.3,您应该能够删除 to_i。总的来说,我们得到:

 def days_till_expired
    (created_at + 1.year - Date.today).to_i
 end

您可能必须使用require 'date'

【讨论】:

    【解决方案3】:

    您可以使用 gem time_diff 来做到这一点: http://www.rubydoc.info/gems/time_diff/0.3.0

    不使用任何外部 gem,您可以使用以下方法轻松获取日期之间的差异:

    def days_till_expired
       delta = created_at + 1.year - Date.today
       %w[days].collect do |step|
          days = 1.send(step)
          (delta / days).to_i.tap do
              delta %= days
          end
       end
    end
    

    【讨论】:

      猜你喜欢
      • 2016-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-24
      • 2010-11-10
      • 2017-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多