class Credential include ActiveModel::Validations attr_accessor :screen_name, :oauth_token, :oauth_secret, :token, :description validates_presence_of :screen_name, :oauth_token, :oauth_secret, :message => 'required' validate :user_exists, :unless => :errors? def initialize(attributes = {}) attributes.each { |k, v| set_recognized_attribute(k, v) } end def save valid? && create_device end def api_key @device.api_key end private def errors? errors.any? end def set_recognized_attribute(name, value) setter_method = "#{name}=" self.send(setter_method, value) if respond_to?(setter_method) end def user @user ||= User.by_screen_name(screen_name).where({ :oauth_token => oauth_token, :oauth_secret => oauth_secret }).first end def create_device @device = Device.find_or_create_by_token!({ :token => token, :description => description, :user_id => user.id }) !@device.nil? end def user_exists errors.add(:user, 'not found') unless user.present? end end