I'm learning how to write a gem. I want to add some methods that I will use in a User model in Rails.
# app/models/user.rb
class User
include Mongoid::Document
include Authme::Model # here's my gem.
field :password_digest, type: String
end
# Gemfile
gem 'authme'
Now, inside my gem I have the following:
- authme
- lib
+ authme
- model.rb
- authme.rb
Here are the contents of the gem.
# lib/authme.rb
require 'authme/version'
require 'authme/model'
module Authme
end
# lib/authme/model.rb
module Authme
module Model
extend ActiveSupport::Concern
included do
include ActiveModel::SecurePassword
has_secure_password validations: false
before_create :create_session_token
end
module ClassMethods
def new_session_token
SecureRandom.urlsafe_base64
end
def encrypt(token)
Digest::SHA1.hexdigest(token.to_s)
end
end
private
def create_session_token
self.session_token = self.class.encrypt(self.class.new_session_token)
end
end
end
I add this to my gemspec:
spec.add_dependency "activesupport", "~> 4.0.1"
To test this, inside the terminal, I tried User.new_session_token
and got this error:
NoMethodError: undefined method `new_session_token' for User:Class
What am I doing wrong? I really want to test this, but I'm out of my depth. I'm not sure how to test that the class User has the included the gem module.
The problem is that you're creating Authme::Model
and Authme::Model::ClassMethods
but you're never actually adding new_session_token
as class methods of Authme::Model
.
If you want to add these methods onto Authme::Model
you need to do something like
module Authme
module Model
module ClassMethods
# define all of your class methods here...
end
extend ClassMethods
end
end
The key part here is the Object#extend .
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.