Namespace Less Engine reuse your projects should be a piece of cake!!                 Shaokun Wu            shaokun.wu@gma...
What’s wrong with  Namespace
• Things like Devise are very very COOL!!!!!!• But we just want to reuse our own  projects• And we never will release it a...
•   we need something could be done in your lifeclass User < ActiveRecord::Base  devise :database_authenticatable, :regist...
What we get for           Namespace less?•   reuse your projects (not just a small part of code)    •   for example, you a...
How?
• Add Namespace less placeholders for  models & controllers• Do inline Namespace::ClassName  definition• Write code without...
in your engine:/app/models/department.rbin your project:/app/models/department.rb           Which one will be used?
in your engine:/app/models/hr/department.rbin your project:/app/models/department.rbclass department < Hr::Departmentend  ...
in your engine:/app/models/hr/department.rb/app/models/department.rbin your project:/app/models/department.rbclass departm...
module Hr class DepartmentsController < ApplicationController   def index    @departments = Department.all # Hr::Departmen...
A model override    sampleclass Hr::Employee < ActiveRecord::Base  def full_name   [first_name, last_name].join(" ")   # Sh...
Controllers• The same as models...
What a about View?• You cannot inherits your view• But you could override them
Helper• Not so sure, perhaps something like... Module Hr::ApplicationHelper  def hello_world; end end Module ApplicationHe...
Find a better place for  the placeholder filesclass MyEngine < Rails::Engine  paths["app/controllers"] << "lib/placeholders...
How to use the engine• in your Gemfile         gem hr, :path => "../hr"• then          $ bundle install• copy the migration...
Some Tips•   add your engine as a submodule instead of a pure Gem    •   your engine is not perfect    •   bundle still ca...
Read this carefully• http://api.rubyonrails.org/classes/Rails/  Engine.html
The code here• https://github.com/shaokun/nl-engine
Upcoming SlideShare
Loading in …5
×

Namespace less engine

916 views
798 views

Published on

Namespace Less Rails Engine, reuse/inherits/override your projects is a piece of cake.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
916
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Namespace less engine

    1. 1. Namespace Less Engine reuse your projects should be a piece of cake!! Shaokun Wu shaokun.wu@gmail.com
    2. 2. What’s wrong with Namespace
    3. 3. • Things like Devise are very very COOL!!!!!!• But we just want to reuse our own projects• And we never will release it as a library for people to use
    4. 4. • we need something could be done in your lifeclass User < ActiveRecord::Base devise :database_authenticatable, :registerable, :rememberable, :trackable, :token_authenticatable, :validatable, :recoverable, :rememberable, :trackable, :validatableend• that code costs you >1 week, but you only got paid 100 RMB???????• and you have a whole projects to be rewritten in that way???????????????????????????????????
    5. 5. What we get for Namespace less?• reuse your projects (not just a small part of code) • for example, you are a site building company • you have copy/paste your cms, news system, fancy image uploader, wysiwyg editor, navigation config... • but every client just wants a fancy different looking...• easy to inherits & override anything • controllers Hey, I am still copy & paste. • models How is the Engine? • views? • helper• write code without namespace • MyAwsomeEngine::MyAwsomeModel • MyAwsomeModel I am still learning the Devise code structure.• something robust, not monkey hacking It just updates again...
    6. 6. How?
    7. 7. • Add Namespace less placeholders for models & controllers• Do inline Namespace::ClassName definition• Write code without Namespace• That’s probably all...
    8. 8. in your engine:/app/models/department.rbin your project:/app/models/department.rb Which one will be used?
    9. 9. in your engine:/app/models/hr/department.rbin your project:/app/models/department.rbclass department < Hr::Departmentend To fix it!
    10. 10. in your engine:/app/models/hr/department.rb/app/models/department.rbin your project:/app/models/department.rbclass department < Hr::Departmentend To fix it, also make engine not complain!
    11. 11. module Hr class DepartmentsController < ApplicationController def index @departments = Department.all # Hr::Department end endendclass Hr::DepartmentsController < ApplicationController def index @departments = Department.all # Department endend
    12. 12. A model override sampleclass Hr::Employee < ActiveRecord::Base def full_name [first_name, last_name].join(" ") # Shaokun Wu endendclass Employee < Hr::Employee def full_name [last_name, first_name].join # 伍少坤 end
    13. 13. Controllers• The same as models...
    14. 14. What a about View?• You cannot inherits your view• But you could override them
    15. 15. Helper• Not so sure, perhaps something like... Module Hr::ApplicationHelper def hello_world; end end Module ApplicationHelper include Hr::ApplicationHelper def hello_world end end
    16. 16. Find a better place for the placeholder filesclass MyEngine < Rails::Engine paths["app/controllers"] << "lib/placeholders/controllers"end
    17. 17. How to use the engine• in your Gemfile gem hr, :path => "../hr"• then $ bundle install• copy the migration files $ rake hr_engine:install:migrations
    18. 18. Some Tips• add your engine as a submodule instead of a pure Gem • your engine is not perfect • bundle still cannot handle same name of gem in different group??• write engine rake task to generate models & controllers in your projects• try with mongoid, but be careful of the namespace • class Department < Hr::Department • # still get hr_departments as the collection name... • # of course, you could set the collection name in mongoid :)
    19. 19. Read this carefully• http://api.rubyonrails.org/classes/Rails/ Engine.html
    20. 20. The code here• https://github.com/shaokun/nl-engine

    ×