设置属性on_create - Rails

时间:2016-07-02 14:50:02

标签: ruby-on-rails

我目前有一个名为Subscribed_date的属性,但现在在一个人订阅后它没有了。考虑到没有逻辑与属性交互,这是有道理的。但是,我不希望此属性仅在订阅时设置日期,而在续订时也是如此。所以需要这样 - 1.每次用户订阅时,他们只订阅了一年。 2.因此,这个属性会在他们订阅时设置,并在年度结束后续订时重置。

基本上它需要是动态的,而不仅仅是设置为created_at属性,我想我很难理解如何做到这一点。任何帮助都会很棒。

控制器:

 class SubscribersController < ApplicationController
  helper_method :sort_column, :sort_direction

  def index
    @search = Subscriber.search(params[:q])
    @subscriber = @search.result
    @search.build_condition if @search.conditions.empty?
    @search.build_sort if @search.sorts.empty?
  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

架构:

   create_table "Subscribers", force: :cascade do |t|
    t.string   "first_name"
    t.string   "last_name"
    t.string   "email"
    t.string   "phone_number"
    t.datetime "created_at",        null: false
    t.datetime "updated_at",        null: false
    t.integer  "visit"
    t.integer  "mug_number"
    t.date     "subscription_date"
  end

MODEL:

  class Subscriber < ActiveRecord::Base
  before_create :generate_mug_number

  scope :subscribing, -> {where subscription_date > 1.year.ago}
  scope :non_subscribing, -> {where.not subscription_date > 1.year.ago}

  has_many :comments
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/i
  VALID_PHONE_REGEX = /\d{10}/
  validates :first_name, presence: true
  validates :last_name, presence: true
  validates :email, :presence => true, :uniqueness => true, :format => VALID_EMAIL_REGEX
  validates :phone_number, :presence => true, :uniqueness => true, :numericality => true, :format => VALID_PHONE_REGEX

  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
    ((created_at + 1.year) - DateTime.now).to_i / 1.day
  end

  def subscribing?
    subscription_date > 1.year.ago
  end

  private

  def generate_mug_number
    last_number = Subscriber.maximum(:mug_number) || 0
    self.mug_number = last_number + 1
  end
end

正如你所看到的,一切都很基础。如果您需要更多信息,请告诉我。谢谢!

1 个答案:

答案 0 :(得分:1)

我想你可以这样做。

def create
  @subscriber = Subscriber.new(subscriber_params) # create method will directly save it, so you're checking if @subcriber.save for nothing
  # I've changed it to new
  if @subscriber.save
    #if the record is saved successfully, it next we'll update the time
    @subscriber.touch(:subscription_date) #this will update and save it.
    flash[:notice] = "Subscriber Has Been Successfully Created"
    redirect_to new_subscriber_path(:subscriber)
  else
    render "new"
  end
end

同样,您可以在续订操作上执行touch,该操作将存储续订当天的当前日期并进行更新。