[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

NoMethodError when trying to validate model field

(D. Alvarado)

1/28/2008 11:38:00 PM

Hi, When validating a field in my user model, I wrote a method
"is_client?" to help with the validation. But I did it wrong because
now I'm getting this error:

NoMethodError in SessionController#create
undefined method `is_client?' for User:Class
RAILS_ROOT: ./script/../config/..
Application Trace | Framework Trace | Full Trace
/usr/local/lib/ruby/gems/1.8/gems/activerecord-1.15.5/lib/
active_record/base.rb:1238:in `method_missing'
/usr/local/apache2/htdocs/easyrx/app/models/user.rb:16
/usr/local/apache2/htdocs/easyrx/app/controllers/session_controller.rb:
12:in `create'

Here's the relevant code. Any ideas what I can do to get rid of this
error? Thanks, - Dave

class User < ActiveRecord::Base
...
validates_as_phone :work_phone, :if => !:work_phone.blank? &&
is_client?, :message => "is not a valid phone number" # line
16

attr_accessible :user_type_id, :user_group_id, :pharmacy_id, :phone, :work_phone, :work_phone_extension, :fax, :bill_to_first_name, :bill_to_last_name, :bill_to_street, :bill_to_city, :bill_to_state, :bill_to_zip, :bill_to_country, :ship_to_first_name, :ship_to_last_name, :ship_to_street, :ship_to_city, :ship_to_state, :ship_to_zip, :ship_to_country, :bill_to_attn, :ship_to_attn, :bill_to_company, :ship_to_company, :bill_to_street2, :ship_to_street2, :login, :email, :password, :password_confirmation

....
def is_client?
user_type_id == 2
end

end
1 Answer

Wyatt Greene

1/29/2008 9:14:00 PM

0

I can explain why you're getting this error. validates_as_phone is a
method. All methods in Ruby have a receiver object. Because
validates_as_phone is called outside of a defined method, it's
receiver object is the User class itself, *not* an object of type
User. The arguments that you pass to the validates_as_phone method
include a call to the is_client? method. Since the receiver object is
the User class, it looks for a method called is_client? defined for
the User class, which would look like this:

def User.is_client?
user_type_id == 2
end

or another way to say the same thing is:

def self.is_client?
user_type_id == 2
end

Instead, it finds a method defined for User objects:

def is_client?
user_type_id == 2
end

Unfortunately, you can't just stick a self. onto your is_client?
method because user_type_id is a method that belongs to User objects,
not the User class itself.


On Jan 28, 6:37 pm, laredotornado <laredotorn...@zipmail.com> wrote:
> Hi, When validating a field in my user model, I wrote a method
> "is_client?" to help with the validation. But I did it wrong because
> now I'm getting this error:
>
> NoMethodError in SessionController#create
> undefined method `is_client?' for User:Class
> RAILS_ROOT: ./script/../config/..
> Application Trace | Framework Trace | Full Trace
> /usr/local/lib/ruby/gems/1.8/gems/activerecord-1.15.5/lib/
> active_record/base.rb:1238:in `method_missing'
> /usr/local/apache2/htdocs/easyrx/app/models/user.rb:16
> /usr/local/apache2/htdocs/easyrx/app/controllers/session_controller.rb:
> 12:in `create'
>
> Here's the relevant code. Any ideas what I can do to get rid of this
> error? Thanks, - Dave
>
> class User < ActiveRecord::Base
> ...
> validates_as_phone :work_phone, :if => !:work_phone.blank? &&
> is_client?, :message => "is not a valid phone number" # line
> 16
>
> attr_accessible :user_type_id, :user_group_id, :pharmacy_id, :phone, :work_phone, :work_phone_extension, :fax, :bill_to_first_name, :bill_to_last_name, :bill_to_street, :bill_to_city, :bill_to_state, :bill_to_zip, :bill_to_country, :ship_to_first_name, :ship_to_last_name, :ship_to_street, :ship_to_city, :ship_to_state, :ship_to_zip, :ship_to_country, :bill_to_attn, :ship_to_attn, :bill_to_company, :ship_to_company, :bill_to_street2, :ship_to_street2, :login, :email, :password, :password_confirmation
>
> ...
> def is_client?
> user_type_id == 2
> end
>
> end