help me debug this model

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

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?

Like I said I don’t understand what the author’s trying to do No i’m not using any debug tools

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?

this link may help some: Active Record Validations — Ruby on Rails Guides

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

Good luck

Max

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

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?

this link may help some: http://guides.rubyonrails.org/active_record_validations.html#custom-methods

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

Good luck

Max

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

Actually the first thing is see when I visit that link is the use of validate without the s

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: Active Record Validations — Ruby on Rails Guides

Walter

Thanks Walter And passing a symbol to message: how does that work?

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

I changed it to

validate :auction_active?, message: self.errors

and now page loads without any errors