Rails::Engine




                      @flaviamissi
                flaviamissi.com.br
What is a engine?




                <<
                             slices
engine
What is a engine?
●
    Works exactly as a built-in rails application
●
    Railtie
    ●
        Active Record
    ●
        Active Resource
    ●
        Action Mailer
    ●
        Action Controller
    ●
        Action View
Application -> Engine -> Railtie

   module Rails
         class Application < Engine
         ...
         class Engine < Railtie
         ...
   ...




                        https://github.com/rails/rails/blob/master/railties/lib/rails/application.rb
                        https://github.com/rails/rails/blob/master/railties/lib/rails/engine.rb
http://www.flickr.com/photos/imelda/1022089050/sizes/l/in/photostream/
Creating Our Engine App




     $ rails new MyApp
What you don't need


 $ rm -rf log/
 $ rm -rf tmp/
 $ rm -rf doc/
 $ rm -rf vendor/
 $ rm -rf config/enviroments/
 $ rm -rf config/initializers/ *
 $ rm -rf config/boot.rb *
 $ rm -rf script/ *



                                   * = later!
And We Have Now...
A Simple Blog App




$ rails g scaffold Blog::Post title:string post:text



            namespace!
routes.rb


Engine::Application.routes.draw do



 Rails.application.routes.draw do
config/application.rb


module MyApp
  class Application < Rails::Application




module MyApp
  class Engine < Rails::Engine
Integrating With Another App




$ cp -R ~/my_engine ~/my_app/vendor/plugins/
Integrating With Another App


                                    $ rake routes

blog_posts     GET /blog/posts(.:format)         {:action=>"index", :controller=>"blog/posts"}
               POST /blog/posts(.:format)         {:action=>"create",
                                                               :controller=>"blog/posts"}
new_blog_post GET /blog/posts/new(.:format) {:action=>"new", :controller=>"blog/posts"}
edit_blog_post GET /blog/posts/:id/edit(.:format) {:action=>"edit", :controller=>"blog/posts"}
blog_post      GET /blog/posts/:id(.:format)       {:action=>"show",
                                                               :controller=>"blog/posts"}
               PUT /blog/posts/:id(.:format)      {:action=>"update",
                                                               :controller=>"blog/posts"}
               DELETE /blog/posts/:id(.:format) {:action=>"destroy",
                                                               :controller=>"blog/posts"}
Só isso?!




http://www.flickr.com/photos/bee721/5784266118/
A Problem...



Migrations and everything inside public/
are not available to the main application
The Solution


namespace :engine do
  task :create, :engine do |cmd, args|
     puts "Creating symbolic links..."
     system "mkdir #{Rails.root.to_s}/public/#{args[:engin
     system "ln -s #{Rails.root.to_s}/vendor/plugins/#{arg
     system "ln -s #{Rails.root.to_s}/vendor/plugins/#{arg
     puts "Done!"
  end
end
Some Interesting Links


●
  https://github.com/search?q=rack&type=Everything&repo=&langOverride=&start_
●
  http://akitaonrails.com/2010/05/10/rails-3-introducao-a-engines
●
  http://api.rubyonrails.org/classes/Rails/Engine.html
●
  http://api.rubyonrails.org/classes/Rails/Railtie.html

Rails::Engine

  • 1.
    Rails::Engine @flaviamissi flaviamissi.com.br
  • 2.
    What is aengine? << slices engine
  • 3.
    What is aengine? ● Works exactly as a built-in rails application ● Railtie ● Active Record ● Active Resource ● Action Mailer ● Action Controller ● Action View
  • 4.
    Application -> Engine-> Railtie module Rails class Application < Engine ... class Engine < Railtie ... ... https://github.com/rails/rails/blob/master/railties/lib/rails/application.rb https://github.com/rails/rails/blob/master/railties/lib/rails/engine.rb
  • 5.
  • 6.
    Creating Our EngineApp $ rails new MyApp
  • 7.
    What you don'tneed $ rm -rf log/ $ rm -rf tmp/ $ rm -rf doc/ $ rm -rf vendor/ $ rm -rf config/enviroments/ $ rm -rf config/initializers/ * $ rm -rf config/boot.rb * $ rm -rf script/ * * = later!
  • 8.
  • 9.
    A Simple BlogApp $ rails g scaffold Blog::Post title:string post:text namespace!
  • 10.
  • 11.
    config/application.rb module MyApp class Application < Rails::Application module MyApp class Engine < Rails::Engine
  • 12.
    Integrating With AnotherApp $ cp -R ~/my_engine ~/my_app/vendor/plugins/
  • 13.
    Integrating With AnotherApp $ rake routes blog_posts GET /blog/posts(.:format) {:action=>"index", :controller=>"blog/posts"} POST /blog/posts(.:format) {:action=>"create", :controller=>"blog/posts"} new_blog_post GET /blog/posts/new(.:format) {:action=>"new", :controller=>"blog/posts"} edit_blog_post GET /blog/posts/:id/edit(.:format) {:action=>"edit", :controller=>"blog/posts"} blog_post GET /blog/posts/:id(.:format) {:action=>"show", :controller=>"blog/posts"} PUT /blog/posts/:id(.:format) {:action=>"update", :controller=>"blog/posts"} DELETE /blog/posts/:id(.:format) {:action=>"destroy", :controller=>"blog/posts"}
  • 14.
  • 15.
    A Problem... Migrations andeverything inside public/ are not available to the main application
  • 16.
    The Solution namespace :enginedo task :create, :engine do |cmd, args| puts "Creating symbolic links..." system "mkdir #{Rails.root.to_s}/public/#{args[:engin system "ln -s #{Rails.root.to_s}/vendor/plugins/#{arg system "ln -s #{Rails.root.to_s}/vendor/plugins/#{arg puts "Done!" end end
  • 17.
    Some Interesting Links ● https://github.com/search?q=rack&type=Everything&repo=&langOverride=&start_ ● http://akitaonrails.com/2010/05/10/rails-3-introducao-a-engines ● http://api.rubyonrails.org/classes/Rails/Engine.html ● http://api.rubyonrails.org/classes/Rails/Railtie.html