Ruby on Rails Tuesday, March 27, 2018

Ok, and I don't understand what this means:
validates :auction_active?, message: :auction_active

class Auction < ActiveRecord::Base
  include ApplicationHelper

  belongs_to :product
  belongs_to :image
  has_many :bids

  validates :product, :image, :min_price, :start_price, :start_time, :duration, :bid_time_step, :bid_price_step, presence: true
  validates :duration, :bid_time_step, numericality: { only_integer: true }
  validates :min_price, :start_price, :bid_price_step, numericality: { greater_than_or_equal_to: 0.01 }
  validates :min_price, :start_price, :bid_price_step, fractionality: { multiplier: 0.01 }

  after_initialize do
    self.start_time = Time.now.round_by(15.minutes) if self.new_record? && self.start_time.nil?
  end

  before_create { |auction| auction.price = auction.start_price }

  def self.finished_soon
    # TODO: use PostgreSQL
    Auction.all.select { |a| (a.time_left <= 5.seconds) && (a.time_left > 1.second) }
  end

  def started?
    start_time < Time.now
  end

  def finished?
    time_left < 0
  end

  def active?
    started? && !finished?
  end

  def time_left
    finish_time - Time.now
  end

  def start_in
    start_time - Time.now
  end

  def finish_time
    start_time + duration.seconds
  end

  def last_user
    bids.sorted.last.user if bids.any?
  end

  def increase_price_and_time
    self.price += self.bid_price_step
    self.duration += self.bid_time_step
    self.save!
  end

  def publish_updates
    PrivatePub.publish_to '/auctions/update', auction_id: self.id, time_left: status_desc(self), price: self.price
  end
end


On Tuesday, March 27, 2018 at 6:54:34 AM UTC-4, Allen Maxwell wrote:
It might help to have the models for auction and user... also, I like to add the annotate gem which gives some header comments in all my models to show what fields etc are there.  Very helpful info and references.

you already know that the validate needs to be validates...

is this an active system or SUD?  do you have a solid development database that is well populated to test/develop against?


other than that I'd have to see it in action to debug further. 

Good luck

Max

On Monday, March 26, 2018 at 6:17:56 PM UTC-6, fugee ohu wrote:
This model has some errors that I wasn't able to get sorted out the two lines that begin with validate should be validates but after that I don't understand what the author's trying to do If I change them to validates I get the error Unknown validator: 'MessageValidator' for   validate :auction_active?, message: :auction_active


class Bid < ActiveRecord::Base
  belongs_to :auction
  belongs_to :user

  validates :auction, :user, presence: true
  validate :auction_active?, message: :auction_active
  validate :last_user_different?

  scope :sorted, -> { order(:created_at) }

  after_create :update_auction

  private

  def auction_active?
    if auction && !auction.active?
      if auction.finished?
        errors.add(:auction, :finished)
      else
        errors.add(:auction, :not_started)
      end
    end
  end

  def last_user_different?
    if auction && user
      errors.add(:user, :same_user_twice) if auction.last_user == user
    end
  end

  def update_auction
    auction.increase_price_and_time
    auction.publish_updates
  end
end



class User < ActiveRecord::Base
  has_many :authorizations
  has_many :bids
  has_one :avatar
  belongs_to :role
  has_many :permissions, through: :role

  validates :nickname, presence: true
  validates :nickname, uniqueness: { case_sensitive: false }

  accepts_nested_attributes_for :avatar

  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable,
         :omniauthable, omniauth_providers: [:facebook, :vkontakte]

  before_create { |user| user.role = Role.default_role unless user.role }

  scope :bots, -> { where(role: Role.bot) }

  def self.random_bot
    bots.order('RANDOM()').first
  end

  def admin?
    role == Role.admin
  end

  def bot?
    role == Role.bot
  end

  def self.find_for_oauth(auth)
    authorization = Authorization.where(provider: auth.provider, uid: auth.uid.to_s).first
    if authorization
      user = authorization.user
    else
      email = auth.info[:email]
      nickname = auth.info[:nickname]
      user = User.where(email: email).first
      if user
        user.create_authorization(auth)
      elsif email.present? && nickname.present?
        password = Devise.friendly_token[0, 20]
        user = User.create(email: email, password: password, password_confirmation: password, nickname: nickname)
        user.create_authorization(auth)
      end
    end
    user
  end

  def create_authorization(auth)
    self.authorizations.create!(provider: auth.provider, uid: auth.uid)
  end

  def add_authorization(auth)
    authorization = Authorization.where(provider: auth.provider, uid: auth.uid.to_s).first
    if authorization
      authorization.user == self
    else
      create_authorization(auth)
      true
    end
  end
end



--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-talk+unsubscribe@googlegroups.com.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/rubyonrails-talk/394b4c7e-27e7-4e39-b9f1-1164887c5eda%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

No comments:

Post a Comment