Manages permalink field on an ActiveRecord model to be used in place of the id field in Rails.
Kevin McPhillips (github@kevinmcphillips.ca)
Installation
Using bundler, add to the Gemfile:
gem 'acts_as_permalink'Or stand alone:
$ gem install acts_as_permalink
Requirements
- Ruby 2.0 or higher
- Rails 4.0 or higher
Usage
This gem works with ActiveRecord, and by convention looks for a title method and a permalink string field on the model:
And then just call it in your model:
class Post < ActiveRecord::Base
  acts_as_permalink
endYou can then use your link helpers normally:
post_path(@post) # "/post/the_name_of_post_here"The title and permalink fields can be overridden with the following options:
from:          :title       # Name of the active record column or function used to generate the permalink
to:            :permalink   # Name of the column where the permalink will be stored
max_length:    60           # Maximum number of characters the permalink will be
underscore:    false        # Prefer using the `_` character as a replacement over the default `-`
scope:         nil          # Make the permalink unique scoped to a particular attribute
allow_update:  false        # Allow the permalink column to be updated
So, for example you have want to store your permalink in a column called path_name and you want to generate your permalink using first and last name, and you want to restrict it to 40 characters, and scope the permalink by organization, your model would look like:
class User < ActiveRecord::Base
  acts_as_permalink from: :full_name, to: :path, max_length: 40, scope: :organization_id
  belongs_to :organization
  def full_name
    [first_name, last_name].join(" ")
  end
endPermalinks can be generated using String#to_permalink like so:
"Hello, world!".to_permalink
> "hello_world"And the patch to string can be avoided by doing a require: "base" in the Gemfile of the application. Conversion is always available through:
Acts::Permalink::Conversion.convert("Hello, world!")
> "hello_world"Tests
$ bundle exec rspec
Changelog
- 
1.2.1 -- Separate out String#to_permalinkpatch. Canrequire: 'base'.
- 
1.2.0 -- Add the allow_updateflag. (by @garethson)
- 
1.1.0 -- Allow the option to scope: :column_idfor uniquness.
- 
1.0.3 -- Update tests to use DatabaseCleaner, and bump some dependency versions. 
- 
1.0.2 -- Use ActiveSupport::Inflector.transliterateto convert accented letters to simple ASCII letters.
- 
1.0.1 -- Fixed a bug where instance methods were being included globally, rather than on calling the class macro. 
- 
1.0.0 -- Internal refactor. Require Rails 4.0 or above and Ruby 2.0 or above. Full release, only took 6 years! 
- 
0.6.0 -- Switch default replacement character to a dash, but allow the underscore: trueproperty to go back to the old format
- 
0.5.0 -- Fix bugs in max_lengthproperty which would sometimes allow the permalink to be longer than the value Usewhere().firstoversend("find_by_#{ column }")
- 
0.4.2 -- Update rspec to new expect() syntax 
- 
0.4.1 -- Documentation improvements. 
- 
0.4.0 -- Rails 4 support. 
- 
0.3.2 -- Fixed regression in STI support. 
- 
0.3.1 -- Rails 3.2 support. 
- 
0.3.0 -- Fixed collision problem with single table inheritance models. Removed dependency on andand gem. 
Contributing
- Fork it ( https://github.com/kmcphillips/acts_as_permalink/fork )
- Create your feature branch (git checkout -b my-new-feature)
- Commit your changes (git commit -am 'Add some feature')
- Push to the branch (git push origin my-new-feature)
- Create a new Pull Request