Starting a new Rails 4 : V. Builing some quick versionned wiki pages rails 4, vestal_versions, wiki, delegate, maruku
- Roadmap
- Creating the Project model
- Some views adjustment : The Demeter Way
- TIP : Rails delegate
- Wiki pages
- Wiki Editor
- Simple (dirty) WikiWords
- Versioning : PaperTrail or Vestal_versions …
- TIP : a gem pointing to a local git repository
- Vestal_version : installation and usage
- Link to a project
Roadmap
So let start a project manager, and make a short TODO List :
- create a basic structure project M/V/C
- create Wiki structure
- versionning / history / WikiLinks / linking to project
- a file manager / uploader with versionning, per project ?
- How to manage rights for users
- Activity feed
Creating the Project model
Classical :
rails g scaffold projects name:string description:text date_create:date owner:references user:references status:string --no-stylesheets
rake db:migrate
In the models :
class Project < ActiveRecord::Base
belongs_to :user
belongs_to :owner, :class_name => 'User', :foreign_key => 'owner_id'
end
class User < ActiveRecord::Base
authenticates_with_sorcery!
validates :password, presence: true, confirmation: true, length: { minimum: 3}, :if => :password
validates :email, presence: true, uniqueness: true
validates :password_confirmation, presence: true, :if => :password
validates :username, presence: true
has_many :projects
has_many :owners, :class_name => 'Project', :foreign_key => 'owner_id'
end
Some views adjustment : The Demeter Way
Same things already used by the users view (paginate, simple_form, … ) It’s not DRY for the moment but there some solution with generators for later notes :)
One interesting thing : in index view I want to show the owner name %td= project.owner.username
, but it may be null some time. The easy way : %td= project.owner.try(:username)
… Dirty somewhere no ?
TIP : Rails delegate
- This will become a table of contents (this text will be scraped).
So checkout this page : http://devblog.avdi.org/2011/07/05/demeter-its-not-just-a-good-idea-its-the-law/
Here, adding some delegate to the user class :
class Project < ActiveRecord::Base
belongs_to :user
belongs_to :owner, :class_name => 'User', :foreign_key => 'owner_id'
delegate :username, :to => :owner, :prefix => true, :allow_nil => true
delegate :username, :to => :user, :prefix => "author", :allow_nil => true
end
And now in the show.html.haml , we can use (with possibly null value) :
%p= @project.owner_username
%p= @project.author_usermane
Wiki pages
Build the scaffold :
rails g scaffold wiki name:string content:text owner:references author:references status:string --no-stylesheets
As usual, adapt the view, the model and the controller … (check the source).
Wiki Editor
WYSIWYG HTML5 editor becomes usual over markup editor … Will check one in the future, but for now, I choose using Maruku.
Simple (dirty) WikiWords
module WikisHelper
def wiki_style(txt)
txt.blank? ? '' : Maruku.new(wiki_words(txt)).to_html
end
def wiki_words(txt)
txt.gsub /(\[\[.*?\]\])/ do |lk|
link = lk[2..-3].gsub(/([A-Z]+|[A-Z][a-z])/){|x| ' ' + x }.strip
exist = Wiki.where(:name => link).take
if exist.blank?
"[#{link} ?](/wikis/new)"
else
"[#{link}](/wikis/#{exist.id})"
end
end
end
end
and call it in view by = raw wiki_style @wiki.content
Versioning : PaperTrail or Vestal_versions …
I choose Vestal_versions, but both gems aren’t ready for Rails 4.
So clone the Github, checkout a new branch, and let’s work on it, with a little tips :
TIP : a gem pointing to a local git repository
Take from http://gembundler.com/v1.3/git.html, ie here :
git clone https://github.com/laserlemon/vestal_versions.git
git checkout -b 'rails-4'
bundle config local.vestal_versions /c/my_local_git_dir/vestal_versions/
and in gemfile :
gem 'vestal_versions', :github => ' laserlemon/vestal_versions', :branch => 'rails-4'
You can visualize the presence of the git branch with just a bundle show
Vestal_version : installation and usage
First, in your local git branch of vestal, remove all the gems dependencies you can find (and check the result with bundle check
).
Run the migration generator :
rails g vestal_versions:migration
rails db:migrate
Add the declaration to the model models/wiki.rb : versioned
. Now have to track incompatibility with Rails 4 …
For the views, I used http://asciicasts.com/episodes/177-model-versioning : views/wikis/show.html.haml :
...
- @wiki.versions.each do |v|
= link_to v.number-1, :version => v.number-1
...
and in the controller :
def show
@wiki.revert_to(params[:version].to_i) if params[:version]
end
Link to a project
I’ve put for the moment a quick link to a wiki page created when a new project is created.
Tweetcomments powered by Disqus