Skip to content

Instantly share code, notes, and snippets.

@rondy
Forked from RStankov/credential.rb
Created April 26, 2012 20:46
Show Gist options
  • Save rondy/2503022 to your computer and use it in GitHub Desktop.
Save rondy/2503022 to your computer and use it in GitHub Desktop.
Sample code from my Using OO to Manage Control Flow post
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
})
[email protected]?
end
def user_exists
errors.add(:user, 'not found') unless user.present?
end
end
class CredentialSerializer
def initialize(credential)
@credential = credential
end
def to_json
{:api_key => @credential.api_key}.to_json
end
def errors
@credential.errors.map { |k, m| "#{k} #{m}" }
end
end
class CredentialsController < ApplicationController
def create
credential = Credential.new(params)
serializer = CredentialSerializer.new(credential)
respond_with serializer
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment