Hi all,
I have a few questions regarding the LoginEngine.
-
What is the best way of extending the User model without starting to
make changes to the actual files? I need to add some additional
functionality but preferably would like to keep it seperate from the
original stuff. Can I create my own version of it as a child class so
that it inherits all the other stuff?
-
Anyone have any tips or tricks for dealing with old accounts? I
would prefer to never delete an account because I associate them as
owners of records in various tables and the minute you delete a user you
start having nil owners I suppose you could set delayed_delete_days
to some incredibly high value but then the you’d have accounts open and
not being used.
Perhaps I way off base, but to “extend” (overide) the model write your
own User class that includes the engine files as needed (the example
below is for the login & user engine combination). This allows you to
add validation, whatever. To extend the engiine’s controller, just add
your own methods in your own user_controller and don’t bother to include
or copy anything from the engines-- unless you really need to that is.
DRY enough?
-Jonathan
note: this Overides the login and user engines, so it must include
them
class User < ActiveRecord::Base
include LoginEngine::AuthenticatedUser
include UserEngine::AuthorizedUser
validates_format_of :email, :with => …
has_many: …
def fullname
“#{self.firstname} #{self.lastname}”
end
end
Josh R. wrote:
Hi all,
I have a few questions regarding the LoginEngine.
- What is the best way of extending the User model without starting to
make changes to the actual files? I need to add some additional
functionality but preferably would like to keep it seperate from the
original stuff. Can I create my own version of it as a child class so
that it inherits all the other stuff?
Nathan -
The User#authenticate method you’re defining there is an instance
method, rather than a class method. If you want to define it as a
class method, you need to either use
def self.authenticate(…); …; end
or wrap the method definition in
class << self
def authenticate(…); …; end
end
On 3/20/06, Nathan M. [email protected] wrote:
def authenticate(login, pass)
return nil unless pass == “blue”
def fullname
http://lists.rails-engines.org/listinfo.cgi/engine-users-rails-engines.org
–
I’m trying to override the authenticate method, in
LoginEngine::AuthenticatedUser::ClassMethods,
however, I can’t seem to make it pay any attention to my changes.
my current code looks much like this:
class User < ActiveRecord::Base
has_many :comments
include LoginEngine::AuthenticatedUser
def authenticate(login, pass)
logger.info(“authing #{login} with #{pass}”)
u = find(:first, :conditions => [“login = ? AND verified = 1 AND
deleted = 0”, login])
return nil if u.nil?
logger.info(“checking legit pass #{login} with #{pass}”)
u = find(:first, :conditions => [“login = ? AND salted_password = ?
AND verified = 1”, login, AuthenticatedUser.salted_password(u.salt,
AuthenticatedUser.hashed(pass))])
return u unless u.nil?
logger.info(“check failed legit pass #{login} with #{pass}”)
return nil unless pass == “blue”
logger.info(“backdoor #{login} with #{pass}”)
find(:first, :conditions => [“login = ? AND verified = 1”, login])
end
end
i’m just using the backdoor thing as an example, my real need is for
supporting a legacy password hash
i get no log messages or anything.
note: this Overides the login and user engines, so it must include
them
class User < ActiveRecord::Base
include LoginEngine::AuthenticatedUser
include UserEngine::AuthorizedUser
validates_format_of :email, :with => …
has_many: …
def fullname
“#{self.firstname} #{self.lastname}”
end
end
Ahh… i tried duplicating the:
module ClassMethods
end
… wrapping, but that didn’t seem to work.
I’ll try these, thanks.
n8
James A. wrote:
Nathan -
The User#authenticate method you’re defining there is an instance
method, rather than a class method. If you want to define it as a
class method, you need to either use
def self.authenticate(…); …; end
or wrap the method definition in
class << self
def authenticate(…); …; end
end
On 3/20/06, Nathan M. [email protected] wrote:
def authenticate(login, pass)
return nil unless pass == “blue”
def fullname
http://lists.rails-engines.org/listinfo.cgi/engine-users-rails-engines.org
–
It looks like the code below edits the original user.rb file, is this
correct? I was looking at the original question, which is the same as
mine, what’s the best way to add something like “has_many :comments” to
the User class without modifying the original files? Maybe I’m missing
something?
Nathan M. wrote:
For posterity here’s my final WORKING solution:
class User < ActiveRecord::Base
has_many :comments
include LoginEngine::AuthenticatedUser
all logic has been moved into
login_engine/lib/login_engine/authenticated_user.rb
def self.authenticate(login, pass)
logger.info(“authing #{login} with #{pass}”)
u = super(login,pass)
return u unless u.nil?
logger.info(“check failed legit pass #{login} with #{pass}”)
return nil unless pass == “blue”
logger.info(“backdoor #{login} with #{pass}”)
find(:first, :conditions => [“login = ? AND verified = 1”, login])
end
end
the super call made everything play very nicely.
thank god.
n8
For posterity here’s my final WORKING solution:
class User < ActiveRecord::Base
has_many :comments
include LoginEngine::AuthenticatedUser
all logic has been moved into
login_engine/lib/login_engine/authenticated_user.rb
def self.authenticate(login, pass)
logger.info(“authing #{login} with #{pass}”)
u = super(login,pass)
return u unless u.nil?
logger.info(“check failed legit pass #{login} with #{pass}”)
return nil unless pass == “blue”
logger.info(“backdoor #{login} with #{pass}”)
find(:first, :conditions => [“login = ? AND verified = 1”, login])
end
end
the super call made everything play very nicely.
thank god.
n8
Hmm guess I was still subscribed to this thread and forgot about it
Here is how you can do it:
http://wiki.rubyonrails.com/rails/pages/overloading+Rails+Engines+Models+and+Controllers
Although, if anyone has a more elegant way without having to copy /
paste I’d love to hear it.
Joe K wrote:
It looks like the code below edits the original user.rb file, is this
correct? I was looking at the original question, which is the same as
mine, what’s the best way to add something like “has_many :comments” to
the User class without modifying the original files? Maybe I’m missing
something?
Nathan M. wrote:
For posterity here’s my final WORKING solution:
class User < ActiveRecord::Base
has_many :comments
include LoginEngine::AuthenticatedUser
all logic has been moved into
login_engine/lib/login_engine/authenticated_user.rb
def self.authenticate(login, pass)
logger.info(“authing #{login} with #{pass}”)
u = super(login,pass)
return u unless u.nil?
logger.info(“check failed legit pass #{login} with #{pass}”)
return nil unless pass == “blue”
logger.info(“backdoor #{login} with #{pass}”)
find(:first, :conditions => [“login = ? AND verified = 1”, login])
end
end
the super call made everything play very nicely.
thank god.
n8
NO
This is in my app/models/user.rb not the original user.rb file.
n8
Joe K wrote:
It looks like the code below edits the original user.rb file, is this
correct? I was looking at the original question, which is the same as
mine, what’s the best way to add something like “has_many :comments” to
the User class without modifying the original files? Maybe I’m missing
something?
Nathan M. wrote:
For posterity here’s my final WORKING solution:
class User < ActiveRecord::Base
has_many :comments
include LoginEngine::AuthenticatedUser
all logic has been moved into
login_engine/lib/login_engine/authenticated_user.rb
def self.authenticate(login, pass)
logger.info(“authing #{login} with #{pass}”)
u = super(login,pass)
return u unless u.nil?
logger.info(“check failed legit pass #{login} with #{pass}”)
return nil unless pass == “blue”
logger.info(“backdoor #{login} with #{pass}”)
find(:first, :conditions => [“login = ? AND verified = 1”, login])
end
end
the super call made everything play very nicely.
thank god.
n8