canonical_dude 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +7 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +96 -0
- data/Rakefile +2 -0
- data/canonical_dude.gemspec +23 -0
- data/init.rb +6 -0
- data/lib/canonical_dude/controller_methods.rb +7 -0
- data/lib/canonical_dude/helper_methods.rb +38 -0
- data/lib/canonical_dude/version.rb +3 -0
- data/lib/canonical_dude.rb +6 -0
- metadata +92 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2011 Rudolf Schmidt
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
= canonical_dude
|
2
|
+
|
3
|
+
canonical_dude ist a small helper for Rails applications to make use of the Canonical URL Tag. Use it to set your
|
4
|
+
preferred version of a URL.
|
5
|
+
|
6
|
+
== Installation
|
7
|
+
== The Gem Version
|
8
|
+
# for system wide usage
|
9
|
+
gem install 'canonical_dude'
|
10
|
+
|
11
|
+
# or just in your Gemfile
|
12
|
+
gem 'canonical_dude'
|
13
|
+
|
14
|
+
=== The Plugin Version
|
15
|
+
script/plugin install http://github.com/rudionrails/canonical_dude.git
|
16
|
+
|
17
|
+
|
18
|
+
== Usage
|
19
|
+
canonical_dude is really easy to use. You only need to put the following into your HTML head:
|
20
|
+
<%= canonical_link_tag %>
|
21
|
+
|
22
|
+
This is it, you'll now see the canonical URL tag for your current page, because by default, canonical_dude will use the
|
23
|
+
request.url. Probably, this will not quite be what you are looking for since you want to define your canonical url by
|
24
|
+
yourself. Not a problem. You also have a controller method available to custom define your canonical URL with some
|
25
|
+
extra whiz-bang!
|
26
|
+
|
27
|
+
Let's assume you have a Products model. Given we are in the ProductsController, you can specify the canonical in the
|
28
|
+
following way (taking the #show action as example):
|
29
|
+
|
30
|
+
|
31
|
+
def show
|
32
|
+
@product = Product.find ( params[:id] )
|
33
|
+
canonical_url @product
|
34
|
+
end
|
35
|
+
|
36
|
+
This is simply defining the canonical tag via the :url_for method provided by Rails, so if you have your products
|
37
|
+
resource defined in routes.rb, then you're good to go. Also, the following examples result in exactly the same
|
38
|
+
canonical URL as shown above:
|
39
|
+
|
40
|
+
# wrapped into url_for
|
41
|
+
canonical_url url_for(@product)
|
42
|
+
|
43
|
+
# giving a hash
|
44
|
+
canonical_url :action => "show", :id => @product.id
|
45
|
+
|
46
|
+
Now you might ask yourself: When it's _just_ using url_for, why do I need this gem altogether? Well, canonical_dude
|
47
|
+
gives you some freedom in defining your canonical urls by checking for special methods. Taking the above example again
|
48
|
+
with a standard rasource approach, you'll have the following URL to the products detail page: /products/:id.
|
49
|
+
Also, you have :product_path and :product_url defined as route helpers. Now if there's another product class defined
|
50
|
+
called AwesomeProduct ( which inherits from Product but obviously does extra cool stuff ;-), you might have another
|
51
|
+
URL for that, too. Sometimes, you have even more of those cases with all different kinds of URLs.
|
52
|
+
|
53
|
+
Being a good SEO Dude you can, of course, always exactly specify `canonical_url product_url(@product)`. Or you could
|
54
|
+
have it always in one place and just use `canonical_url @product` in all those controllers. All you need now is a helper
|
55
|
+
which could look like so:
|
56
|
+
|
57
|
+
module CanonicalHelper
|
58
|
+
|
59
|
+
# alias the AwesomeProduct's canonical url to our initial product url without affecting the awesome_product_url
|
60
|
+
alias_method :canonical_awesome_product_url, :product_url
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
You can define the following helper methods for any class and canonical_dude will attempt to look for those:
|
66
|
+
def canonical_product_url
|
67
|
+
# ...
|
68
|
+
end
|
69
|
+
|
70
|
+
def canonical_product_path
|
71
|
+
# ...
|
72
|
+
end
|
73
|
+
|
74
|
+
# and as the _grand_ fallback
|
75
|
+
def canonical_url
|
76
|
+
# ...
|
77
|
+
end
|
78
|
+
|
79
|
+
|
80
|
+
If you have none of those methods defined, canonical_dude will, fallback again to whatevery :url_for gives you.
|
81
|
+
Also worth noting is, that, if you defined any custom canonical_* method which returns nil, canonical_dude will not
|
82
|
+
render the canonical_link_tag.
|
83
|
+
|
84
|
+
Last but not least, you can control when to show your canonical_link_tag with the canonical_url? helper method:
|
85
|
+
|
86
|
+
# in your HTML head of layouts/application.html.erb
|
87
|
+
<%= canonical_link_tag if canonical_url? %>
|
88
|
+
|
89
|
+
|
90
|
+
canonical_url? will return true if you have explicitly defined :canonical_url in your controller. If not, it returns
|
91
|
+
false. So if you only want a canonical tag on specific placed, you have a basic method for it.
|
92
|
+
|
93
|
+
|
94
|
+
== Copyright
|
95
|
+
|
96
|
+
Copyright (c) 2011 Rudolf Schmidt See LICENSE.txt for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "canonical_dude/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "canonical_dude"
|
7
|
+
s.version = CanonicalDude::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Rudolf Schmidt"]
|
10
|
+
|
11
|
+
s.homepage = "http://github.com/rudionrails/canonical_dude"
|
12
|
+
s.summary = %q{Easy canonical URL generation}
|
13
|
+
s.description = %q{canonical_dude is a Rails plugin to easily set your preferred version of a URL via the canonical tag}
|
14
|
+
|
15
|
+
s.rubyforge_project = "canonical_dude"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
|
22
|
+
s.add_development_dependency 'rspec', '~> 2.5.0'
|
23
|
+
end
|
data/init.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
module CanonicalDude::HelperMethods
|
2
|
+
|
3
|
+
# tag to include within your HTML header, e.g.:
|
4
|
+
# <%= canonical_link_tag %>
|
5
|
+
def canonical_link_tag( url_for_options = nil )
|
6
|
+
url = canonical_url_from( url_for_options || @_canonical_url_for_options || request.url )
|
7
|
+
tag( :link, :rel => 'canonical', :href => url ) if url # custom url methods may sometimes return nil --R
|
8
|
+
end
|
9
|
+
|
10
|
+
# returns true if canonical_url has been explicitly set
|
11
|
+
def canonical_url?
|
12
|
+
!!@_canonical_url_for_options
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def canonical_url_from( url_for_options )
|
19
|
+
case url_for_options
|
20
|
+
when Hash then url_for( url_for_options )
|
21
|
+
when String then url_for_options
|
22
|
+
else
|
23
|
+
# could be an AR instance, so let's try some custom methods
|
24
|
+
# will turn a User instance into 'user'
|
25
|
+
canonical_method_name = url_for_options.class.name.downcase.gsub( '::', '_' )
|
26
|
+
|
27
|
+
custom_canonical_method_name = [
|
28
|
+
"canonical_#{canonical_method_name}_url",
|
29
|
+
"canonical_#{canonical_method_name}_path",
|
30
|
+
"canonical_url_for"
|
31
|
+
].find { |m| respond_to? m }
|
32
|
+
|
33
|
+
return url_for( url_for_options ) unless custom_canonical_method_name
|
34
|
+
send( custom_canonical_method_name, url_for_options )
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
metadata
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: canonical_dude
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 23
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
- 0
|
10
|
+
version: 1.0.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Rudolf Schmidt
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-03-28 00:00:00 +02:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: rspec
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 27
|
30
|
+
segments:
|
31
|
+
- 2
|
32
|
+
- 5
|
33
|
+
- 0
|
34
|
+
version: 2.5.0
|
35
|
+
type: :development
|
36
|
+
version_requirements: *id001
|
37
|
+
description: canonical_dude is a Rails plugin to easily set your preferred version of a URL via the canonical tag
|
38
|
+
email:
|
39
|
+
executables: []
|
40
|
+
|
41
|
+
extensions: []
|
42
|
+
|
43
|
+
extra_rdoc_files: []
|
44
|
+
|
45
|
+
files:
|
46
|
+
- .gitignore
|
47
|
+
- Gemfile
|
48
|
+
- LICENSE.txt
|
49
|
+
- README.rdoc
|
50
|
+
- Rakefile
|
51
|
+
- canonical_dude.gemspec
|
52
|
+
- init.rb
|
53
|
+
- lib/canonical_dude.rb
|
54
|
+
- lib/canonical_dude/controller_methods.rb
|
55
|
+
- lib/canonical_dude/helper_methods.rb
|
56
|
+
- lib/canonical_dude/version.rb
|
57
|
+
has_rdoc: true
|
58
|
+
homepage: http://github.com/rudionrails/canonical_dude
|
59
|
+
licenses: []
|
60
|
+
|
61
|
+
post_install_message:
|
62
|
+
rdoc_options: []
|
63
|
+
|
64
|
+
require_paths:
|
65
|
+
- lib
|
66
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
hash: 3
|
72
|
+
segments:
|
73
|
+
- 0
|
74
|
+
version: "0"
|
75
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
76
|
+
none: false
|
77
|
+
requirements:
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
hash: 3
|
81
|
+
segments:
|
82
|
+
- 0
|
83
|
+
version: "0"
|
84
|
+
requirements: []
|
85
|
+
|
86
|
+
rubyforge_project: canonical_dude
|
87
|
+
rubygems_version: 1.5.0
|
88
|
+
signing_key:
|
89
|
+
specification_version: 3
|
90
|
+
summary: Easy canonical URL generation
|
91
|
+
test_files: []
|
92
|
+
|