Slide 1

Slide 1 text

Saturday, 3 March 12

Slide 2

Slide 2 text

How my curiosity about new features in Ruby on Rails... Saturday, 3 March 12

Slide 3

Slide 3 text

... kind of sort of... Saturday, 3 March 12

Slide 4

Slide 4 text

...indirectly led me to getting a new job... Saturday, 3 March 12

Slide 5

Slide 5 text

...where I do awesome “stuff”... Saturday, 3 March 12

Slide 6

Slide 6 text

...for an awesome community... Saturday, 3 March 12

Slide 7

Slide 7 text

...and exactly what that awesome “stuff” entails. Saturday, 3 March 12

Slide 8

Slide 8 text

aka “Namespacing: Good for the soul” Saturday, 3 March 12

Slide 9

Slide 9 text

Ryan Bigg Saturday, 3 March 12

Slide 10

Slide 10 text

Ryan Bigg @ryanbigg Saturday, 3 March 12

Slide 11

Slide 11 text

Ryan Bigg Radar @ryanbigg Saturday, 3 March 12

Slide 12

Slide 12 text

Saturday, 3 March 12

Slide 13

Slide 13 text

Saturday, 3 March 12

Slide 14

Slide 14 text

Saturday, 3 March 12

Slide 15

Slide 15 text

Saturday, 3 March 12

Slide 16

Slide 16 text

Saturday, 3 March 12

Slide 17

Slide 17 text

Saturday, 3 March 12

Slide 18

Slide 18 text

Saturday, 3 March 12

Slide 19

Slide 19 text

Saturday, 3 March 12

Slide 20

Slide 20 text

26,890 reputation top 0.67% of all time Saturday, 3 March 12

Slide 21

Slide 21 text

Saturday, 3 March 12

Slide 22

Slide 22 text

1% Saturday, 3 March 12

Slide 23

Slide 23 text

Saturday, 3 March 12

Slide 24

Slide 24 text

Community Manager Community Manager Saturday, 3 March 12

Slide 25

Slide 25 text

Saturday, 3 March 12

Slide 26

Slide 26 text

Saturday, 3 March 12

Slide 27

Slide 27 text

Saturday, 3 March 12

Slide 28

Slide 28 text

Saturday, 3 March 12

Slide 29

Slide 29 text

Saturday, 3 March 12

Slide 30

Slide 30 text

Saturday, 3 March 12

Slide 31

Slide 31 text

Saturday, 3 March 12

Slide 32

Slide 32 text

1,784 commits Saturday, 3 March 12

Slide 33

Slide 33 text

1,784 commits (or roughly, 30%) Saturday, 3 March 12

Slide 34

Slide 34 text

Engines Engines Saturday, 3 March 12

Slide 35

Slide 35 text

James Adam James Adam Saturday, 3 March 12

Slide 36

Slide 36 text

Oct 31, 2005 Oct 31, 2005 Saturday, 3 March 12

Slide 37

Slide 37 text

0.14.2 0.14.2 Rails Rails Saturday, 3 March 12

Slide 38

Slide 38 text

Kevin Smith Kevin Smith Saturday, 3 March 12

Slide 39

Slide 39 text

“[engines are a] nasty hack that breaks every new version of Rails” http://glu.ttono.us/articles/2006/08/30/guide-things-you-shouldnt-be-doing-in-rails Saturday, 3 March 12

Slide 40

Slide 40 text

“Stop trying to write ‘neato ajax driven thingies’” http://glu.ttono.us/articles/2006/08/30/guide-things-you-shouldnt-be-doing-in-rails Saturday, 3 March 12

Slide 41

Slide 41 text

Saturday, 3 March 12

Slide 42

Slide 42 text

“I didn't want Rails to succumb to the lure of high-level components like login systems, forums, content management, and the likes.” - DHH http://david.heinemeierhansson.com/arc/000407.html Saturday, 3 March 12

Slide 43

Slide 43 text

Saturday, 3 March 12

Slide 44

Slide 44 text

Saturday, 3 March 12

Slide 45

Slide 45 text

Saturday, 3 March 12

Slide 46

Slide 46 text

Saturday, 3 March 12

Slide 47

Slide 47 text

“But the goal of Rails is to create a world where [engines] are neither needed or strongly desired. Obviously, we are not quite there yet.” - DHH http://weblog.rubyonrails.org/2005/11/11/why-engines-and- components-are-not-evil-but-distracting Saturday, 3 March 12

Slide 48

Slide 48 text

“Engines have not received the blessing of the RoR core team, and I wouldn't expect any different, because it would be madness to include them in the core Rails.” - James Adam http://article.gmane.org/gmane.comp.lang.ruby.rails/29166 Saturday, 3 March 12

Slide 49

Slide 49 text

Madness! Saturday, 3 March 12

Slide 50

Slide 50 text

Engine Support Rails < 2.3 Use engines plugin https://github.com/lazyatom/engines Saturday, 3 March 12

Slide 51

Slide 51 text

Engine Support Rails 2.3 LOL http://railscasts.com/episodes/149-rails-engines Saturday, 3 March 12

Slide 52

Slide 52 text

Yehuda Katz Yehuda Katz Saturday, 3 March 12

Slide 53

Slide 53 text

Piotr Sarnacki Piotr Sarnacki Saturday, 3 March 12

Slide 54

Slide 54 text

Saturday, 3 March 12

Slide 55

Slide 55 text

Engine Support Rails 3.0 - Not bad Saturday, 3 March 12

Slide 56

Slide 56 text

Engine Support Rails 3.1 - OH YEAH Saturday, 3 March 12

Slide 57

Slide 57 text

Saturday, 3 March 12

Slide 58

Slide 58 text

Saturday, 3 March 12

Slide 59

Slide 59 text

Before Spree 1.0 Saturday, 3 March 12

Slide 60

Slide 60 text

Saturday, 3 March 12

Slide 61

Slide 61 text

Spree Product App path/to/engine/app/models/product.rb Product Saturday, 3 March 12

Slide 62

Slide 62 text

Spree Product App Product path/to/app/app/models/product.rb path/to/engine/app/models/product.rb Product Saturday, 3 March 12

Slide 63

Slide 63 text

Saturday, 3 March 12

Slide 64

Slide 64 text

~300 lines of documentation Rails::Engine Saturday, 3 March 12

Slide 65

Slide 65 text

rails plugin new blorgh Saturday, 3 March 12

Slide 66

Slide 66 text

rails plugin new blorgh --full Saturday, 3 March 12

Slide 67

Slide 67 text

rails plugin new blorgh --full --mountable Saturday, 3 March 12

Slide 68

Slide 68 text

A gem by default Saturday, 3 March 12

Slide 69

Slide 69 text

gem ‘blorgh’, :git => ‘git://github.com/radar/blorgh’ Saturday, 3 March 12

Slide 70

Slide 70 text

Step away from the Gemfile Saturday, 3 March 12

Slide 71

Slide 71 text

blorgh.gemspec Saturday, 3 March 12

Slide 72

Slide 72 text

blorgh.gemspec s.add_development_dependency Saturday, 3 March 12

Slide 73

Slide 73 text

blorgh.gemspec s.add_development_dependency s.add_dependency Saturday, 3 March 12

Slide 74

Slide 74 text

lib/blorgh.rb require ‘blorgh/engine’ module Blorgh end Saturday, 3 March 12

Slide 75

Slide 75 text

lib/blorgh/engine.rb module Blorgh class Engine < Rails::Engine end end Saturday, 3 March 12

Slide 76

Slide 76 text

initializer “something” do # your code here end Inside Blorgh::Engine Saturday, 3 March 12

Slide 77

Slide 77 text

Inside Blorgh::Engine config.generators do |g| g.orm :webscale end Saturday, 3 March 12

Slide 78

Slide 78 text

Rails::Application < Rails::Engine Saturday, 3 March 12

Slide 79

Slide 79 text

“In Rails 3.0, a Rails::Application object was introduced which is nothing more than an Engine but with the responsibility of coordinating the whole boot process.” Rails::Application Saturday, 3 March 12

Slide 80

Slide 80 text

Saturday, 3 March 12

Slide 81

Slide 81 text

Inside Blorgh::Engine endpoint SomeRackApp Saturday, 3 March 12

Slide 82

Slide 82 text

Rakefile (tasks go into lib/tasks) Saturday, 3 March 12

Slide 83

Slide 83 text

config initializers locales routes Saturday, 3 March 12

Slide 84

Slide 84 text

Generators Saturday, 3 March 12

Slide 85

Slide 85 text

blorgh:install:migrations Comes standard Saturday, 3 March 12

Slide 86

Slide 86 text

GOOD README not included but for the love of God write one Saturday, 3 March 12

Slide 87

Slide 87 text

The best Rails 3.1 forum system. Saturday, 3 March 12

Slide 88

Slide 88 text

The best Rails 3.1 forum system. Ever. Saturday, 3 March 12

Slide 89

Slide 89 text

Namespacing Namespacing Saturday, 3 March 12

Slide 90

Slide 90 text

rails g model post Saturday, 3 March 12

Slide 91

Slide 91 text

rails g model post app/models/post.rb Saturday, 3 March 12

Slide 92

Slide 92 text

Forem Post App path/to/engine/app/models/post.rb Post Saturday, 3 March 12

Slide 93

Slide 93 text

Forem Post App Post path/to/app/app/models/post.rb path/to/engine/app/models/post.rb Post Saturday, 3 March 12

Slide 94

Slide 94 text

“Just call it something different” Saturday, 3 March 12

Slide 95

Slide 95 text

Yeah. Nah. Saturday, 3 March 12

Slide 96

Slide 96 text

isolate_namespace Forem Saturday, 3 March 12

Slide 97

Slide 97 text

rails g model post Saturday, 3 March 12

Slide 98

Slide 98 text

rails g model post app/models/forem/post.rb Saturday, 3 March 12

Slide 99

Slide 99 text

Forem :: Post App path/to/engine/app/models/forem/post.rb Post Saturday, 3 March 12

Slide 100

Slide 100 text

Forem :: Post App Post path/to/app/app/models/post.rb path/to/engine/app/models/forem/post.rb Post Saturday, 3 March 12

Slide 101

Slide 101 text

forem_posts Saturday, 3 March 12

Slide 102

Slide 102 text

Forem::PostsController forem_posts Saturday, 3 March 12

Slide 103

Slide 103 text

Forem::PostsController app/views/forem/posts forem_posts Saturday, 3 March 12

Slide 104

Slide 104 text

Rails.application.routes.draw Saturday, 3 March 12

Slide 105

Slide 105 text

Rails.application.routes.draw do namespace :forem do resources :forums end end forem/config/routes.rb Saturday, 3 March 12

Slide 106

Slide 106 text

Rails.application.routes.draw Saturday, 3 March 12

Slide 107

Slide 107 text

Forem::Engine.routes.draw Rails.application.routes.draw Saturday, 3 March 12

Slide 108

Slide 108 text

Forem::Engine.routes.draw do resources :forums ... end forem/config/routes.rb Saturday, 3 March 12

Slide 109

Slide 109 text

mount Forem::Engine, :at => “forum” the_app/config/routes.rb Saturday, 3 March 12

Slide 110

Slide 110 text

forums_path /forum/forums Saturday, 3 March 12

Slide 111

Slide 111 text

forums_path forem. /forum/forums Saturday, 3 March 12

Slide 112

Slide 112 text

dropbears_path /dropbears Saturday, 3 March 12

Slide 113

Slide 113 text

dropbears_path main_app. /dropbears Saturday, 3 March 12

Slide 114

Slide 114 text

form_for [forem, @topic, @post] Saturday, 3 March 12

Slide 115

Slide 115 text

form_for [forem, @topic, @post] /forums/topics/1/posts Saturday, 3 March 12

Slide 116

Slide 116 text

Hard Problems Saturday, 3 March 12

Slide 117

Slide 117 text

HOW 2 SHOT AUTH? Saturday, 3 March 12

Slide 118

Slide 118 text

spree_auth Saturday, 3 March 12

Slide 119

Slide 119 text

http://aubenoire.files.wordpress.com/2011/05/not-my-problem.jpg Saturday, 3 March 12

Slide 120

Slide 120 text

class ApplicationController def forem_user current_user end end Saturday, 3 March 12

Slide 121

Slide 121 text

Forem.user_class = “User” config/initializers/forem.rb Into Put Saturday, 3 March 12

Slide 122

Slide 122 text

User#to_s Saturday, 3 March 12

Slide 123

Slide 123 text

Authlogic Saturday, 3 March 12

Slide 124

Slide 124 text

Devise Saturday, 3 March 12

Slide 125

Slide 125 text

Custom Saturday, 3 March 12

Slide 126

Slide 126 text

HOW 2 SHOT AUTH? (part two) Saturday, 3 March 12

Slide 127

Slide 127 text

CanCan CanCan Saturday, 3 March 12

Slide 128

Slide 128 text

<% if can?(:read, category) %> Saturday, 3 March 12

Slide 129

Slide 129 text

Forem::DefaultPermissions Saturday, 3 March 12

Slide 130

Slide 130 text

Forem::DefaultPermissions can_read_forem_forum?(forum) can_read_forem_category?(category) Saturday, 3 March 12

Slide 131

Slide 131 text

can_read_forem_forum?(forum) def true end Saturday, 3 March 12

Slide 132

Slide 132 text

def can_read_forem_forum?(forum) # your code goes here end app/models/user.rb Saturday, 3 March 12

Slide 133

Slide 133 text

module Forem class Ability include CanCan::Ability def initialize(user) user ||= Forem.user_class.constantize.new can :read, Forem::Category do |category| user.can_read_forem_category?(category) end ... Saturday, 3 March 12

Slide 134

Slide 134 text

module Forem class Ability include CanCan::Ability def initialize(user) user ||= Forem.user_class.constantize.new can :read, Forem::Category do |category| user.can_read_forem_category?(category) end ... Saturday, 3 March 12

Slide 135

Slide 135 text

class Forem::ApplicationController def current_ability Forem::Ability.new(forem_user) end ... end Saturday, 3 March 12

Slide 136

Slide 136 text

<% if can?(:read, category) %> Saturday, 3 March 12

Slide 137

Slide 137 text

Theming Saturday, 3 March 12

Slide 138

Slide 138 text

stylesheet_link_tag “forem/theme/twist” app/views/layouts/ forem.html.erb Saturday, 3 March 12

Slide 139

Slide 139 text

module Forem module Theme module Twist class Engine < Rails::Engine end end end end Saturday, 3 March 12

Slide 140

Slide 140 text

Rails::Engine \m/ Saturday, 3 March 12

Slide 141

Slide 141 text

app/assets/stylesheets/ forem/theme/twist.css forem-theme-twist Saturday, 3 March 12

Slide 142

Slide 142 text

app/assets/stylesheets/ forem/theme/twist.css forem-theme-twist javascript + images too! Saturday, 3 March 12

Slide 143

Slide 143 text

Install + Setup Saturday, 3 March 12

Slide 144

Slide 144 text

gem ‘forem’, :git => “git://github.com/radar/forem” Saturday, 3 March 12

Slide 145

Slide 145 text

gem ‘forem’, :git => “git://github.com/radar/forem” bundle install Saturday, 3 March 12

Slide 146

Slide 146 text

gem ‘forem’, :git => “git://github.com/radar/forem” bundle install rake forem:install:migrations Saturday, 3 March 12

Slide 147

Slide 147 text

gem ‘forem’, :git => “git://github.com/radar/forem” bundle install rake forem:install:migrations rake db:migrate Saturday, 3 March 12

Slide 148

Slide 148 text

gem ‘forem’, :git => “git://github.com/radar/forem” bundle install rake forem:install:migrations rake db:migrate create config/initializers/forem.rb Saturday, 3 March 12

Slide 149

Slide 149 text

gem ‘forem’, :git => “git://github.com/radar/forem” bundle install rake forem:install:migrations rake db:migrate create config/initializers/forem.rb Add forem_user method to AppController Saturday, 3 March 12

Slide 150

Slide 150 text

gem ‘forem’, :git => “git://github.com/radar/forem” bundle install rake forem:install:migrations rake db:migrate create config/initializers/forem.rb Add forem_user method to AppController Add User#to_s method Saturday, 3 March 12

Slide 151

Slide 151 text

gem ‘forem’, :git => “git://github.com/radar/forem” bundle install rake forem:install:migrations rake db:migrate create config/initializers/forem.rb Add forem_user method to AppController Add User#to_s method Go into console + create first forum Saturday, 3 March 12

Slide 152

Slide 152 text

gem ‘forem’, :git => “git://github.com/radar/forem” bundle install rake forem:install:migrations rake db:migrate create config/initializers/forem.rb Add forem_user method to AppController Add User#to_s method Go into console + create first forum Mount Forem::Engine, :at => ‘/’ Saturday, 3 March 12

Slide 153

Slide 153 text

gem ‘forem’, :git => “git://github.com/radar/forem” bundle install rake forem:install:migrations rake db:migrate Pray that it works. create config/initializers/forem.rb Add forem_user method to AppController Add User#to_s method Go into console + create first forum Mount Forem::Engine, :at => ‘/’ Saturday, 3 March 12

Slide 154

Slide 154 text

gem ‘forem’, :git => “git://github.com/radar/forem” Saturday, 3 March 12

Slide 155

Slide 155 text

gem ‘forem’, :git => “git://github.com/radar/forem” bundle install Saturday, 3 March 12

Slide 156

Slide 156 text

gem ‘forem’, :git => “git://github.com/radar/forem” bundle install rails g forem:install Saturday, 3 March 12

Slide 157

Slide 157 text

gem ‘forem’, :git => “git://github.com/radar/forem” bundle install rails g forem:install Answer two questions. Saturday, 3 March 12

Slide 158

Slide 158 text

gem ‘forem’, :git => “git://github.com/radar/forem” bundle install rails g forem:install It works! Answer two questions. (assuming you have a User model) Saturday, 3 March 12

Slide 159

Slide 159 text

Spree 1.0 Saturday, 3 March 12

Slide 160

Slide 160 text

Namespace everything Saturday, 3 March 12

Slide 161

Slide 161 text

SpreeCore Saturday, 3 March 12

Slide 162

Slide 162 text

Spree::Core Spree::Auth Saturday, 3 March 12

Slide 163

Slide 163 text

Spree ::Core::Product Saturday, 3 March 12

Slide 164

Slide 164 text

Spree ::Product Saturday, 3 March 12

Slide 165

Slide 165 text

Spree:: Product App Product path/to/app/app/models/product.rb path/to/engine/app/models/spree/product.rb Product Saturday, 3 March 12

Slide 166

Slide 166 text

Spree:: Product App Product path/to/app/app/models/product.rb path/to/engine/app/models/spree/product.rb Product Saturday, 3 March 12

Slide 167

Slide 167 text

Forem Forem Saturday, 3 March 12

Slide 168

Slide 168 text

Forem App Forem Saturday, 3 March 12

Slide 169

Slide 169 text

Forem::Engine.routes.draw Saturday, 3 March 12

Slide 170

Slide 170 text

mount Forem::Engine, :at => “forums” Saturday, 3 March 12

Slide 171

Slide 171 text

Core Auth API Promo Dash Spree Saturday, 3 March 12

Slide 172

Slide 172 text

Core Auth API Promo Dash App Spree Saturday, 3 March 12

Slide 173

Slide 173 text

Spree::Core::Engine.routes.draw Spree::Auth::Engine.routes.draw Spree::Promo::Engine.routes.draw Spree::Dash::Engine.routes.draw Spree::Api::Engine.routes.draw Saturday, 3 March 12

Slide 174

Slide 174 text

mount Spree::Core::Engine, :at => ‘/’ mount Spree::Auth::Engine, :at => ‘/’ mount Spree::Api::Engine, :at => ‘/’ mount Spree::Dash::Engine, :at => ‘/’ mount Spree::Promo::Engine, :at => ‘/’ Saturday, 3 March 12

Slide 175

Slide 175 text

mount Spree::Core::Engine, :at => ‘/’ mount Spree::Auth::Engine, :at => ‘/’ mount Spree::Api::Engine, :at => ‘/’ mount Spree::Dash::Engine, :at => ‘/’ mount Spree::Promo::Engine, :at => ‘/’ mount Spree::YourExtension, :at => ‘/’ mount Spree::YourExtension, :at => ‘/’ mount Spree::YourExtension, :at => ‘/’ mount Spree::YourExtension, :at => ‘/’ Saturday, 3 March 12

Slide 176

Slide 176 text

spree_core.root_path spree_auth.login_path Saturday, 3 March 12

Slide 177

Slide 177 text

HAHAHAHAHAHAHAHAHAH AHAHAHAHAHAHAHAHAHA HAHAHAHAHAHAHAHAHAH AHAHAHAHAHAHAHAHAHA HAHAHAHAHAHAHAHAHAH AHAHAHAHAHAHAHAHAHA HAHAHAHAHAHAHAHAHAH AHAHAHAHAHAHAHAHAHA HAHAHAHAHAHAHAHAHAH AHAHAHAHAHAHAHAHAHA HAHAHAHAHAHAHAHAHAH Saturday, 3 March 12

Slide 178

Slide 178 text

mount Spree::Core::Engine, :at => ‘/’ Saturday, 3 March 12

Slide 179

Slide 179 text

spree.login_path spree.root_path Saturday, 3 March 12

Slide 180

Slide 180 text

Spree::Core::Engine.routes.prepend Saturday, 3 March 12

Slide 181

Slide 181 text

Spree::Core::Engine.routes.prepend do mount Spree::Auth::Engine, :as => “spree” end Saturday, 3 March 12

Slide 182

Slide 182 text

Core Auth API Promo Dash App Extensions Saturday, 3 March 12

Slide 183

Slide 183 text

Core Auth API Promo Dash App Extensions Saturday, 3 March 12

Slide 184

Slide 184 text

Fix everything Saturday, 3 March 12

Slide 185

Slide 185 text

describe Spree::ProductsController do it “gets a list of products” do get :index end end spec/controllers/products_controller_spec.rb Saturday, 3 March 12

Slide 186

Slide 186 text

describe Spree::ProductsController do it “gets a list of products” do get :index end end spec/controllers/products_controller_spec.rb No route matches { :controller => “Spree::ProductsController”, :action => “index” } Saturday, 3 March 12

Slide 187

Slide 187 text

Saturday, 3 March 12

Slide 188

Slide 188 text

http://stackoverflow.com/a/5832908/15245 How do I write a Rails 3.1 engine controller test in RSpec? The workaround is quite simple, instead of this get  :show,  :id  =>  1 use this get  :show,  {:id  =>  1,  :use_route  =>  :posts} Saturday, 3 March 12

Slide 189

Slide 189 text

Well, duh. Saturday, 3 March 12

Slide 190

Slide 190 text

:use_route  =>  :spree Saturday, 3 March 12

Slide 191

Slide 191 text

Saturday, 3 March 12

Slide 192

Slide 192 text

rails-3.1 (3-1-stable)♐ ack ":use_route" actionpack/lib/action_dispatch/routing/route_set.rb actionpack/test/controller/routing_test.rb actionpack/test/template/form_helper_test.rb Saturday, 3 March 12

Slide 193

Slide 193 text

rails-3.1 (3-1-stable)♐ ack ":use_route" actionpack/lib/action_dispatch/routing/route_set.rb actionpack/test/controller/routing_test.rb actionpack/test/template/form_helper_test.rb Three files. No comments. No description. Saturday, 3 March 12

Slide 194

Slide 194 text

Saturday, 3 March 12

Slide 195

Slide 195 text

Magic. Saturday, 3 March 12

Slide 196

Slide 196 text

Fixed everything Saturday, 3 March 12

Slide 197

Slide 197 text

Bug fixes too! (thanks!) Saturday, 3 March 12

Slide 198

Slide 198 text

Spree 1.0 is the now Saturday, 3 March 12

Slide 199

Slide 199 text

Use it. (Please) Saturday, 3 March 12

Slide 200

Slide 200 text

One more thing... Saturday, 3 March 12

Slide 201

Slide 201 text

I lied to you. I’m sorry. Saturday, 3 March 12

Slide 202

Slide 202 text

Really. Really. Saturday, 3 March 12

Slide 203

Slide 203 text

Saturday, 3 March 12

Slide 204

Slide 204 text

Enjoy. Enjoy. Saturday, 3 March 12

Slide 205

Slide 205 text

Enjoy. Enjoy. Thanks! Saturday, 3 March 12