publishus¶ ↑
Introduction¶ ↑
At this stage this is purely an experimental piece of work to help me understand more of everything. It came about because of our need for a generic publishing framework to support the following needs:
-
Allow for editing of generic content whilst retaining all the revision history
-
Allow for publishing individual content items when theyre ready to go live
-
Allow publishing of all unpublished content at once
Implementation¶ ↑
We looked at some of the versioning frameworks, all of them seemed capable but we saw none that really addressed publishing as such. The one that stood out was vestal_versions
[http://github.com/laserlemon/vestal_versions] so we used that as our starting point. This is an extremely thin layer on top of the excellent vestal_versions
[http://github.com/laserlemon/vestal_versions]. Vestal versions handles all of the revisioning off to another table and some really nice features but we needed a way to track publishing itself hence some additional attributes on our models and some extra methods. The basic idea is that all publishable items gain a named_scope
called published
which will filter down the results to only include items that are currently considered “live”. Each instance gains a live
method that will return the current live version of that object. For now when using the named_scope you’ve got to call a proxy extension called live. The named_scope returns items that have a published version and the live method actually reverts the items to those versions.
Installation¶ ↑
Prerequisites:
publishus requires vestal_versions by laserlemon Follow instructions on installing vestal_versions
[http://github.com/laserlemon/vestal_versions] first
Install the gem:
gem install publishus
In environment.rb
:
Rails::Initializer.run do |config| ... config.gem 'publishus' ... end
At your application root, run:
$ sudo rake gems:install
Example¶ ↑
To version and activate publishing add this to your models:
class Post < ActiveRecord::Base publishable has_many :comments end class Comment < ActiveRecord::Base publishable belongs_to :page end
And add some fields to your tables in a migration (hopefully we’ll automate this stuff later):
add_column :posts, :published_at, :datetime add_column :posts, :deleted_at, :datetime add_column :comments, :published_at, :datetime add_column :comments, :deleted_at, :datetime
Using it:
>> page = Page.create(:name => "Page 1") => #<Page id: 1, name: "Page 1"> >> page.version => 1 (this bit is vestal versions magic) >> page.publish! => true >> page.update_attribute(:name, "Page 2") => true >> page => #<Page id: 1, name: "Page 2"> >> page.live => #<Page id: 1, name: "Page 1"> >> Page.published.live => [#<Page id: 1, name: "Page 1">]
And for associations
>> page.comments.create(:body => "Great page") => #<Comment id: 1, body: "Great page"> >> page.comments.published => [] >> page.comments.first.publish! => true >> page.comments.published.live => [#<Comment id: 1, body: "Great page">] >> page.comments.first.update_attribute(:body, "Just an ok page") => true >> page.comments.create(:body => "Another comment") => #<Comment id: 2, body: "Another comment"> >> page.comments => [#<Comment id: 1, body: "Just an ok page">, #<Comment id: 2, body: "Another comment">] >> page.comments.published.live => [#<Comment id: 1, body: "Great page">]
Notes¶ ↑
-
I really would’t use this, its not tested and its not finished
-
If you’re interested in helping out or know of something that already does this then let me know
Copyright¶ ↑
Copyright © 2010 lostboy. See LICENSE for details.