vanities 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Manifest +9 -0
- data/README.rdoc +92 -0
- data/Rakefile +15 -0
- data/lib/generators/vanities/USAGE +0 -0
- data/lib/generators/vanities/templates/create_vanities.rb +20 -0
- data/lib/generators/vanities/templates/vanities_controller.rb +8 -0
- data/lib/generators/vanities/templates/vanity.rb +16 -0
- data/lib/generators/vanities/vanities_generator.rb +51 -0
- data/lib/vanities.rb +17 -0
- data/vanities.gemspec +31 -0
- metadata +90 -0
data/Manifest
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
README.rdoc
|
2
|
+
Rakefile
|
3
|
+
lib/generators/vanities/USAGE
|
4
|
+
lib/generators/vanities/templates/create_vanities.rb
|
5
|
+
lib/generators/vanities/templates/vanities_controller.rb
|
6
|
+
lib/generators/vanities/templates/vanity.rb
|
7
|
+
lib/generators/vanities/vanities_generator.rb
|
8
|
+
lib/vanities.rb
|
9
|
+
Manifest
|
data/README.rdoc
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
= Vanities
|
2
|
+
|
3
|
+
Vanities is a gem for use with a Rails 3 project that will transform
|
4
|
+
URLs like this:
|
5
|
+
|
6
|
+
http://example.com/users/1
|
7
|
+
|
8
|
+
Into something cool, like this:
|
9
|
+
|
10
|
+
http://example.com/foo
|
11
|
+
|
12
|
+
== The Vanity URL Explained
|
13
|
+
|
14
|
+
Vanities implements the concept of the "vanity URL". Similar to a vanity
|
15
|
+
license plate, it's a unique name or ID chosen by the user that is specific to them.
|
16
|
+
However, this doesn't necessarily have to be for a user - in theory, any model in your
|
17
|
+
Rails 3 application can use a vanity URL.
|
18
|
+
|
19
|
+
This gem works by redirecting requests for a vanity name - say "foo" - to the object
|
20
|
+
that owns it. So for example, visiting example.com/foo would perform a redirect to
|
21
|
+
example.com/users/1 (assuming a user object with an ID of 1 owned the "foo" vanity).
|
22
|
+
|
23
|
+
== Common Use Cases
|
24
|
+
|
25
|
+
Some common use cases for something like vanities would be:
|
26
|
+
* user profiles (www.example.com/users/22829 => www.example.com/leeroy)
|
27
|
+
* specific products in an e-commerce system (www.exampleshop.com/products/19920 => www.exampleshop.com/buythis)
|
28
|
+
|
29
|
+
== How To Install
|
30
|
+
|
31
|
+
Vanities is pretty simple to install. First, a few requirements and caveats:
|
32
|
+
|
33
|
+
=== Requirements
|
34
|
+
|
35
|
+
<b>REST-based models</b> - every model with which you want to use vanities MUST be made
|
36
|
+
a RESTful resource in your routes file (config/routes.rb). This is absolutely required.
|
37
|
+
|
38
|
+
<b>Rails 3</b> - vanities is built on Rails 3. It might work with older versions of Rails, but
|
39
|
+
only if you go back and reverse engineer some of the routing stuff, and possibly other things
|
40
|
+
if using versions of Rails prior to the 2.3.x series.
|
41
|
+
|
42
|
+
<b>ActiveRecord</b> - vanities needs a table in the database to keep track of the individual
|
43
|
+
vanity names. Datamapper and/or -otherorm- isn't/aren't supported out of the box, but the
|
44
|
+
setup itself is so simple that you could probably reverse-engineer this to use another ORM
|
45
|
+
if you wanted to.
|
46
|
+
|
47
|
+
<b>Letters-Only for Vanity URLs</b> - Vanity URLs can contain letters only - no numbers. If you
|
48
|
+
don't like this functionality, you can manually remove the regular expression call in the
|
49
|
+
route for the vanities controller.
|
50
|
+
|
51
|
+
=== Installation
|
52
|
+
|
53
|
+
In your application's Gemfile, add the following line:
|
54
|
+
|
55
|
+
gem 'vanities'
|
56
|
+
|
57
|
+
Then in your console/terminal, do:
|
58
|
+
|
59
|
+
bundle install
|
60
|
+
|
61
|
+
Next, while still in your terminal/console:
|
62
|
+
|
63
|
+
rails g vanities
|
64
|
+
|
65
|
+
You'll see a list of instructions that it'll print out. Next you'll want to
|
66
|
+
open up your model that you want to have a vanity URL (say a User model) and add this
|
67
|
+
line to it to substitute the polymorphic association that does all the magic:
|
68
|
+
|
69
|
+
has_vanity
|
70
|
+
|
71
|
+
Finally, do:
|
72
|
+
|
73
|
+
rake db:migrate
|
74
|
+
|
75
|
+
And you're all set!
|
76
|
+
|
77
|
+
== Using vanities
|
78
|
+
|
79
|
+
Every model that has a call to 'has_vanity' will have a vanity object associated with it.
|
80
|
+
Each instance of your model will have one - and only one - vanity. Vanities CANNOT be repeated
|
81
|
+
across different models. For example, let's say you have a user with a vanity called "leeroy", and
|
82
|
+
a product; you cannot call the product's vanity "leeroy" as well, as that's already taken by
|
83
|
+
the aforementioned user.
|
84
|
+
|
85
|
+
To set up a vanity for a model, all you need to do is create a vanity. Say you're in the Rails
|
86
|
+
console. This would be as simple as:
|
87
|
+
|
88
|
+
u = User.first
|
89
|
+
u.vanity = Vanity.new(:name => "leeroy")
|
90
|
+
|
91
|
+
Finally, you can go to http://localhost:3000/leeroy to be automatically redirected
|
92
|
+
to the user's 'show' action.
|
data/Rakefile
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'echoe'
|
4
|
+
|
5
|
+
Echoe.new('vanities', '0.1.1') do |x|
|
6
|
+
x.description = "Give each of your models a simple 'vanity' URL.
|
7
|
+
Makes example.com/users/1 into something like example.com/foobar"
|
8
|
+
x.url = "https://github.com/jaustinhughey/vanities"
|
9
|
+
x.author = "J. Austin Hughey"
|
10
|
+
x.email = "jaustinhughey@gmail.com"
|
11
|
+
x.ignore_pattern = ["tmp/*", "script/*"]
|
12
|
+
x.development_dependencies = []
|
13
|
+
end
|
14
|
+
|
15
|
+
Dir["#{File.dirname(__FILE__)}/tasks/*.rake"].sort.each { |ext| load ext }
|
File without changes
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class CreateVanities < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
# Create the vanities table
|
4
|
+
create_table :vanities do |t|
|
5
|
+
t.string :name
|
6
|
+
t.integer :vain_id
|
7
|
+
t.string :vain_type
|
8
|
+
end
|
9
|
+
|
10
|
+
# Add some indexes
|
11
|
+
add_index :vanities, :name, :unique => true
|
12
|
+
add_index :vanities, :vain_id
|
13
|
+
add_index :vanities, :vain_type
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.down
|
18
|
+
drop_table :vanities
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class Vanity < ActiveRecord::Base
|
2
|
+
# The "Vanity" class has a polymorphic association called "vain".
|
3
|
+
# In any model that has a vanity entry, you can reference this association like so:
|
4
|
+
#
|
5
|
+
# has_one :vanity, :as => :vain
|
6
|
+
#
|
7
|
+
# For your convenience, there's a simpler method called 'has_vanity'. Just call it inside
|
8
|
+
# any model that should have a vanity:
|
9
|
+
#
|
10
|
+
# has_vanity
|
11
|
+
#
|
12
|
+
# And that's it! See the vanities README file for more information.
|
13
|
+
|
14
|
+
belongs_to :vain, :polymorphic => true
|
15
|
+
validates :name, :presence => true, :uniqueness => true
|
16
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
class VanitiesGenerator < Rails::Generators::Base
|
2
|
+
source_root File.expand_path('../templates', __FILE__)
|
3
|
+
|
4
|
+
# Copy over the database migration template
|
5
|
+
def generate_vanities_migration
|
6
|
+
copy_file "create_vanities.rb", "db/migrate/#{timestamp}_create_vanities.rb"
|
7
|
+
end
|
8
|
+
|
9
|
+
# Copy over the vanity model
|
10
|
+
def generate_vanity_model
|
11
|
+
copy_file "vanity.rb", "app/models/vanity.rb"
|
12
|
+
end
|
13
|
+
|
14
|
+
# This method actually copies over the vanities controller code
|
15
|
+
# into app/controllers/vanities_controller.rb
|
16
|
+
def generate_vanities_controller
|
17
|
+
copy_file "vanities_controller.rb", "app/controllers/vanities_controller.rb"
|
18
|
+
end
|
19
|
+
|
20
|
+
# Add the route to wire up the vanities controller
|
21
|
+
# Indentation looks a little funky here because I'd strongly prefer
|
22
|
+
# to keep the indentation in the target routes.rb file as it is
|
23
|
+
def inject_new_route
|
24
|
+
route "
|
25
|
+
controller :vanities do
|
26
|
+
match ':vname' => :show, :via => :get, :constraints => {:vname => /[A-Za-z]+/}
|
27
|
+
end"
|
28
|
+
end
|
29
|
+
|
30
|
+
# This method prints some basic setup instructions for the user.
|
31
|
+
def talk_to_user
|
32
|
+
puts "****************************************"
|
33
|
+
puts " Thanks for installing vanities!"
|
34
|
+
puts "****************************************"
|
35
|
+
puts "Now that you've run the generator, all you have left to do are the following tasks:"
|
36
|
+
puts "1) rake db:migrate"
|
37
|
+
puts "2) In any model you want to have a vanity URL, add the line:"
|
38
|
+
puts " has_vanity"
|
39
|
+
puts " Inside the model, just like you would an association (this is in fact what it does)"
|
40
|
+
puts "3) Make sure that the model in question is set up as a RESTful resource in your"
|
41
|
+
puts " project's routes file. If it isn't, this won't work."
|
42
|
+
puts ""
|
43
|
+
puts "Check out this project's GitHub page or README.rdoc for more information."
|
44
|
+
puts ""
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
def timestamp
|
49
|
+
Time.now.strftime("%Y%m%d%H%M%S")
|
50
|
+
end
|
51
|
+
end
|
data/lib/vanities.rb
ADDED
data/vanities.gemspec
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{vanities}
|
5
|
+
s.version = "0.1.1"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["J. Austin Hughey"]
|
9
|
+
s.date = %q{2010-11-07}
|
10
|
+
s.description = %q{Give each of your models a simple 'vanity' URL.
|
11
|
+
Makes example.com/users/1 into something like example.com/foobar}
|
12
|
+
s.email = %q{jaustinhughey@gmail.com}
|
13
|
+
s.extra_rdoc_files = ["README.rdoc", "lib/generators/vanities/USAGE", "lib/generators/vanities/templates/create_vanities.rb", "lib/generators/vanities/templates/vanities_controller.rb", "lib/generators/vanities/templates/vanity.rb", "lib/generators/vanities/vanities_generator.rb", "lib/vanities.rb"]
|
14
|
+
s.files = ["README.rdoc", "Rakefile", "lib/generators/vanities/USAGE", "lib/generators/vanities/templates/create_vanities.rb", "lib/generators/vanities/templates/vanities_controller.rb", "lib/generators/vanities/templates/vanity.rb", "lib/generators/vanities/vanities_generator.rb", "lib/vanities.rb", "Manifest", "vanities.gemspec"]
|
15
|
+
s.homepage = %q{https://github.com/jaustinhughey/vanities}
|
16
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Vanities", "--main", "README.rdoc"]
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
s.rubyforge_project = %q{vanities}
|
19
|
+
s.rubygems_version = %q{1.3.7}
|
20
|
+
s.summary = %q{Give each of your models a simple 'vanity' URL. Makes example.com/users/1 into something like example.com/foobar}
|
21
|
+
|
22
|
+
if s.respond_to? :specification_version then
|
23
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
24
|
+
s.specification_version = 3
|
25
|
+
|
26
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
27
|
+
else
|
28
|
+
end
|
29
|
+
else
|
30
|
+
end
|
31
|
+
end
|
metadata
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: vanities
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 25
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 1
|
10
|
+
version: 0.1.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- J. Austin Hughey
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-11-07 01:00:00 -06:00
|
19
|
+
default_executable:
|
20
|
+
dependencies: []
|
21
|
+
|
22
|
+
description: |-
|
23
|
+
Give each of your models a simple 'vanity' URL.
|
24
|
+
Makes example.com/users/1 into something like example.com/foobar
|
25
|
+
email: jaustinhughey@gmail.com
|
26
|
+
executables: []
|
27
|
+
|
28
|
+
extensions: []
|
29
|
+
|
30
|
+
extra_rdoc_files:
|
31
|
+
- README.rdoc
|
32
|
+
- lib/generators/vanities/USAGE
|
33
|
+
- lib/generators/vanities/templates/create_vanities.rb
|
34
|
+
- lib/generators/vanities/templates/vanities_controller.rb
|
35
|
+
- lib/generators/vanities/templates/vanity.rb
|
36
|
+
- lib/generators/vanities/vanities_generator.rb
|
37
|
+
- lib/vanities.rb
|
38
|
+
files:
|
39
|
+
- README.rdoc
|
40
|
+
- Rakefile
|
41
|
+
- lib/generators/vanities/USAGE
|
42
|
+
- lib/generators/vanities/templates/create_vanities.rb
|
43
|
+
- lib/generators/vanities/templates/vanities_controller.rb
|
44
|
+
- lib/generators/vanities/templates/vanity.rb
|
45
|
+
- lib/generators/vanities/vanities_generator.rb
|
46
|
+
- lib/vanities.rb
|
47
|
+
- Manifest
|
48
|
+
- vanities.gemspec
|
49
|
+
has_rdoc: true
|
50
|
+
homepage: https://github.com/jaustinhughey/vanities
|
51
|
+
licenses: []
|
52
|
+
|
53
|
+
post_install_message:
|
54
|
+
rdoc_options:
|
55
|
+
- --line-numbers
|
56
|
+
- --inline-source
|
57
|
+
- --title
|
58
|
+
- Vanities
|
59
|
+
- --main
|
60
|
+
- README.rdoc
|
61
|
+
require_paths:
|
62
|
+
- lib
|
63
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
64
|
+
none: false
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
hash: 3
|
69
|
+
segments:
|
70
|
+
- 0
|
71
|
+
version: "0"
|
72
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
hash: 11
|
78
|
+
segments:
|
79
|
+
- 1
|
80
|
+
- 2
|
81
|
+
version: "1.2"
|
82
|
+
requirements: []
|
83
|
+
|
84
|
+
rubyforge_project: vanities
|
85
|
+
rubygems_version: 1.3.7
|
86
|
+
signing_key:
|
87
|
+
specification_version: 3
|
88
|
+
summary: Give each of your models a simple 'vanity' URL. Makes example.com/users/1 into something like example.com/foobar
|
89
|
+
test_files: []
|
90
|
+
|