Download - Engines Lightning Talk
The Rails Engine That
Could?
Saturday, April 28, 2012
Hi!
dpickett on Twitter
www.launchware.com on the InterTubes
Hiring
Saturday, April 28, 2012
• A Brief History
• A Rails Engine In Rails 3.1
• Implementation Gotchas
• Deployment Gotchas With Heroku
• Conclusions
What I Can Tell You About Rails Engines
Saturday, April 28, 2012
• Components in Rails Beta and Rails 1
• Components removed in Rails 2
Out With The Old...
Saturday, April 28, 2012
...In With the New
• Engines in Rails 3
• Enginex as part of Rails 3.1
Saturday, April 28, 2012
Generating
rails generate plugin thomas --mountable
Saturday, April 28, 2012
Saturday, April 28, 2012
Saturday, April 28, 2012
Manage Dependencies In Your Gemspec
Shift Your Perspective
Saturday, April 28, 2012
Shifting Perspectives
• Think like an API designer
• Favor composition over inheritance
• Obey SOLID principles for more maintainable code
Saturday, April 28, 2012
Maintain Perspective
• Do as you would normally:
• Write migrations
• Seed data
• Run rake tasks
• Run generators
Saturday, April 28, 2012
Gotchas
Saturday, April 28, 2012
Routes
• Routes are loaded where you mount them
• Only one opportunity for placement
• No flexibility to divide up routes for fine tuning priorities
Saturday, April 28, 2012
Namespacing• Namespace Your Engine - it will save you lots of
pain.
• If you must in your consuming application, use ActiveSupport’s require_dependency to override:
require_dependency Thomas::Engine.root.join(“app/models/user”).to_s
class User < ActiveRecord::Base#override the engine here
end
Saturday, April 28, 2012
Routes
• Routes are loaded where you mount them
• Only one opportunity for placement
• No flexibility to divide up routes for fine tuning priorities
Saturday, April 28, 2012
Consumer::Application do Thomas::Routes::UserRoutes.draw(self) #custom routes here Thomas::Routes::ScheduleRoutes.draw(self)end
module Thomas module Routes module UserRoutes def self.draw(map) map.instance_eval do resources :user... end end end endendSaturday, April 28, 2012
Named Routes Helpers
• If you don’t namespace, I found these to be incredibly problematic
• You must include helpers in your application controller and in your request specs/tests
Saturday, April 28, 2012
class ApplicationController < ActionController::Base include Thomas::Engine.routes.url_helpers include ActionDispatch::Routing::PolymorphicRoutesend
You’ll use these two lines a lot.
Apply when you get an undefined *_path or *_url method
Saturday, April 28, 2012
Saturday, April 28, 2012
Devise
• Wiring I18n load paths is deferred until the app comes up, disallowing override ability
Saturday, April 28, 2012
class Thomas::Engine < Rails::Engine config.after_initialize do Rails.application.config.after_initialize do paths = I18n.load_path.delete_if do |p| p =~ /devise\-/ end #put devise’s default locales in its place I18n.load_path = paths + I18n.load_path I18n.reload!
endend
Saturday, April 28, 2012
Inherited ResourcesAnd Responders
Doesn’t WorkDrops Your Responder
Saturday, April 28, 2012
Saturday, April 28, 2012
Wrong Thomas......Go B’s
Saturday, April 28, 2012
class ApplicationController < ActionController::Base def self.engine_inherit_resources inherit_resources self.responder = MobileResponder end endend
Saturday, April 28, 2012
Deploying Private Gems To Heroku
• Bundle with your github credentials in plaintext
• Maintain your own gem server
• Write a rake task to vendor the gem and commit when deploying
• NEW: http://www.gemfury.com/
Saturday, April 28, 2012
Overall, Engines Are Great
• There’s still room for improvement, but they’re awesome once you get going
• They will challenge you as a developer and as a Rails Framework user
Saturday, April 28, 2012
Thanks!
• I’ll post slides @ www.launchware.com
• Chat me up on Twitter: @dpickett
• Chat me up on IRC: dpickett in #boston.rb
• We’re hiring!
Saturday, April 28, 2012