help me debug this model

30 views
Skip to first unread message

fugee ohu

unread,
Mar 26, 2018, 8:17:56 PM3/26/18
to Ruby on Rails: Talk
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

Mugurel Chirica

unread,
Mar 27, 2018, 4:07:58 AM3/27/18
to rubyonra...@googlegroups.com
What have you tried so far in debugging this?

Have you used any debugger like pry to see what happens when you rune the code?

fugee ohu

unread,
Mar 27, 2018, 4:30:24 AM3/27/18
to Ruby on Rails: Talk
Like I said I don't understand what the author's trying to do No i'm not using any debug tools

Allen Maxwell

unread,
Mar 27, 2018, 6:54:34 AM3/27/18
to Ruby on Rails: Talk
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

fugee ohu

unread,
Mar 27, 2018, 9:17:14 AM3/27/18
to Ruby on Rails: Talk
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


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



fugee ohu

unread,
Mar 27, 2018, 9:20:20 AM3/27/18
to Ruby on Rails: Talk
Actually the first thing is see when I visit that link is the use of validate without the s


On Tuesday, March 27, 2018 at 6:54:34 AM UTC-4, Allen Maxwell wrote:

Walter Lee Davis

unread,
Mar 27, 2018, 11:44:54 AM3/27/18
to rubyonra...@googlegroups.com

> On Mar 27, 2018, at 9:20 AM, fugee ohu <fuge...@gmail.com> wrote:
>
> Actually the first thing is see when I visit that link is the use of validate without the s

The validate method is used along with a custom validator method. The validates method is "built in" and uses a DSL to specify how you want the validations to work.

validate :has_a_bow_on_top?

private

def has_a_bow_on_top?
unless bow&.on_top?
errors[:bow].add "must be on top"
false
end
end

The built-in validates method is configured like this:

validates :bow, presence: true

This is a very basic example, there are lots more things you can do with it. For all of our sakes, please read this entire page: http://guides.rubyonrails.org/active_record_validations.html

Walter
> --
> 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-ta...@googlegroups.com.
> To post to this group, send email to rubyonra...@googlegroups.com.
> To view this discussion on the web visit https://groups.google.com/d/msgid/rubyonrails-talk/b8ab4f9b-1682-4006-8d91-8f2c556f34e6%40googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.

fugee ohu

unread,
Mar 27, 2018, 2:04:38 PM3/27/18
to Ruby on Rails: Talk
Thanks Walter And passing a symbol to message: how does that work? 

Walter Lee Davis

unread,
Mar 27, 2018, 2:12:27 PM3/27/18
to rubyonra...@googlegroups.com
Read the docs I linked you to, and if that doesn't explain it, then ask the author of the code you're extending. It's possible that it is passing a reference to a proc or lambda, but I have not seen that exact code before, so I can only guess.

Walter

fugee ohu

unread,
Mar 27, 2018, 9:52:14 PM3/27/18
to Ruby on Rails: Talk
I changed it to 
validate :auction_active?, message: self.errors
and now page loads without any errors
Reply all
Reply to author
Forward
0 new messages