SlideShare una empresa de Scribd logo
1 de 34
Migrating PriceChirp to Rails 3.0
Steven Evatt
Blog: http://www.evatt.com/blog
Web: http://PriceChirp.com
Twitter: @sevatt
Houston-RoR Nov 2010
The pain points
2
Today We'll Cover:

Why Upgrade?

Pain points / Issues

Tips

Take Aways
3
Full Disclosure

PriceChirp is my main side project designed to
help people (myself included) save money on
Amazon

My background is in Perl
4
Why???

Gem ecosystem is starting to require Rails 3.0

Too many deprecation notices
5
How much work was it?

3 weeks of nights / weekends

According to svn

Paths added 67

Paths modified 112

Paths removed 45

Replaced Restful_Authentication with Devise

Converted from Prototype to UJS jQuery
6
Where to start?

Upgrade to Rails 2.3.9

Upgrade Gems

Fix code to remove deprecation message

Bundler

Have test for critical functionality

Install Rails_upgrade plugin

Make a new branch in your source control
7
Source Control

Svn copy http://svn...com/pricechirp/trunk/
http://svn...com/pricechirp/branches/migrate_to_rails
3

Svn checkout
http://svn...com/pricechirp/branches/migrate_to_rails
3 migrate
8
Plugin → Rails_upgrade

Documentation out of order and gives wrong
syntax for rails command

Mostly run from rails 2.3

Useful rake tasks

Rake rails:upgrade:check

Rake rails:upgrade:backup

Rake rails:upgrade:routes

Rake rails:upgrade:gems

Rake rails:upgrade:configuration
9
Installing Rails 3

Rails new .

Creates a rails3 project
with the name of the
current directory

If directory name is
migrate:

Application name is
Migrate::Application

Must update in 12 places
to change
10
Bundler

Bundler manages an application's dependencies
through its entire life across many machines
systematically and repeatably.

Gemfile

gem “rack”, “~>1.1”

gem “rspec, :requires => “spec”

It doesn’t take long before you want to use
bundler on all projects
11
Bundler II

Passenger is not ignoring my Gemfile :test,
:development block in production

To get bundler to work with capistrano:

Add to deploy.rb:
require "bundler/capistrano"
12
Upgrade Gems

gem ‘will_paginate’, ‘~> 3.0.pre2’, :require =>
‘will_paginate’

factory_girl_rails => compatibility mode
13
Passenger

Apache configuration changed

from:
RailsEnv development

to:
RackEnv development
14
Upgrade Plugins

Restful Authentication → Devise

copy crypted_password => encrypted_password

copy salt => encrypted_salt

set confirmed date

nil is a valid salt with Restful Auth, not in Devise

Change helper methods
− :login_required → :authenticate_user!
− logged_in? → user_signed_in?

Exception_notification
15
RAILS_ENV and RAILS_ROOT
 RAILS_ENV → Rails.env
 Rails.env.production?
− If RAILS_ENV == “production”
− If Rails.env.production?
 RAILS_ROOT → Rails.root
 RAILS_CACHE → Rails.cache
16
XSS protection is everywhere

Learn to love .html_safe.

All strings are not safe until flagged as safe.
17
Views

forms helpers changed from <% to <%=

removed error_messages_for

link_to_remote

Use :remote => true

link_to
18
UJS / jQuery

Converted rjs to erb

Converted from Prototype to jQuery

Get jQuery
− http://docs.jquery.com/Downloading_jQuery
− /public/javascripts/jquery-1.4.2.min.js

Copy rails.js from
github.com/rails/jquery-ujs/raw/master/src/rails.js

:remote => true
19
Active Record Changes

passing options hash containing :conditions,
:include, :joins, :limit, :offset, :order,
:select, :readonly, :group, :having, :from,
:lock to any of the ActiveRecord provided
class methods, is now deprecated.

Find → where

find_by_x('xxx') => where(:x => ‘xxx’).first

where(‘b like ?’, value)
20
Active Record “Bug”

select('distinct(x)') is ignored when passed to
.count
Example
Item.where('updated_at < ?',
1.days.ago ).select('distinct(asin)').all
Produces the following query:
Item Load (6.3ms) SELECT distinct(asin) FROM `items`
WHERE (updated_at < '2010-10-16 01:06:05')
21
Active Record “Bug” II
Now, when we use .count instead of .all, the .select call
is ignored:
Item.where('updated_at < ?',
1.days.ago ).select('distinct(asin)').count
Yields:
SQL (5.4ms) SELECT COUNT(*) AS count_id FROM
(SELECT 1 FROM `items` WHERE (updated_at <
'2010-10-16 01:09:55')) AS subquery
22
Active Record “Bug” III

Work around
Put a .all before the .count
Item.where('updated_at < ?',
1.days.ago ).select('distinct(asin)').all.count
Issue
If you attempt to use :group ie .count(:group => :asin) you
get an error

More Info on “bug”

https://rails.lighthouseapp.com/projects/8994/
tickets/5698-select-ignored-in-subquery-
when-querying-with-count
23
Custom to_s formatting for dates
Example: Time.now.to_s(:js)

From:
ActiveSupport::CoreExtensions::Time::Conversions::DATE_FOR
MATS.merge!(:js => ‘%m %d, %Y %H:%M:%S’)

To:
Time::DATE_FORMATS[:js] = ‘%m %d, %Y %H:%M:%S’
24
Logging Rails.cache Activity

By default, Rails3 does not log Rails.cache activity
Cache read: user.default
Cache fetch_hit: user.default
Cache read: user.count ({:expires_in=>300 seconds})
Cache generate: user.count ({:expires_in=>300 seconds})
Cache write: user.count ({:expires_in=>300 seconds})

To enable logging
In environment.rb
Rails.cache.logger ||= Rails.logger
25
Action Mailer

Action_mailer defaults to :smtp although
everything says it defaults to :sendmail
config.action_mailer.delivery_method = :sendmail

Action_mailer requires
default_url_options[:host] to be defined
config.action_mailer.default_url_options[:host] = {
:host => ‘pricechirp.com’ }
26
script/* replaced by script/rails

script/rails replaces all the scripts that used to
be in the script directory
Safe to remove: about, console, dbconsole, destroy
generate, plugin, runner, and server
27
RSS

Had to wrap my
“xml.description” output
in a CDATA block for it
to display
<![CDATA[
…
]]>
28
Validate-on-callback methods

validate_on_create
validate :x, :on => :create
29
Remove Debugging Statements

logger.info request.inspect
Rails 2.3.9 Rails 3.0
request.inspect 5.9k 330k
30
Mime::Type
Error:
A ActionView::MissingTemplate occurred in pages#index:
Missing template pages/index with {:locale=>[:en, :en],
:handlers=>[:builder, :erb, :rjs, :rhtml, :rxml], :formats=>[:"text/*"]} in
view paths ….
actionpack (3.0.1) lib/action_view/paths.rb:15:in `find'
Solution:
In /config/initializers/mime_types.rb, add:
Mime::Type.register “text/*”, :html
31
Current Issues I
A ActionController::UnknownHttpMethod occurred in #:
PROPFIND, accepted HTTP methods are get, head, put,
post, delete, and options actionpack (3.0.1)
lib/action_dispatch/http/request.rb:59:in `request_method'
32
Current Issues II
Bundler – During a “cap deploy”
...
[pricechirp.com] executing command
** [out :: pricechirp.com] (in /home/pricechirp)
** [out :: pricechirp.com] Could not find gem 'rspec-rails (>= 2.0.1, runtime)' in any of
the gem sources.
** [out :: pricechirp.com] Try running `bundle install`.
command finished
*** [deploy:update_code] rolling back
...
33
Take Aways

Upgrade / fix deprecated code as
best you can before you start

Use Rails_upgrade plugin

XSS Protection is everywhere

Syntax changes:

Views form helpers

Link_to_remote replaced with :remote => true

Active Record changes: .find → .where

Validate-on-callback

Configurations

There is a lot of deprecated
advice out there, remember
to check the dates
34
Thanks for Coming!
Steven Evatt
Email: steven@evatt.com
Site: http://PriceChirp.com
Blog: http://www.evatt.com/blog
Twitter: @sevatt

Más contenido relacionado

La actualidad más candente

Ruby on Rails 2.1 What's New
Ruby on Rails 2.1 What's NewRuby on Rails 2.1 What's New
Ruby on Rails 2.1 What's NewLibin Pan
 
Ror Seminar With agilebd.org on 23 Jan09
Ror Seminar With agilebd.org on 23 Jan09Ror Seminar With agilebd.org on 23 Jan09
Ror Seminar With agilebd.org on 23 Jan09Shaer Hassan
 
Using Sinatra to Build REST APIs in Ruby
Using Sinatra to Build REST APIs in RubyUsing Sinatra to Build REST APIs in Ruby
Using Sinatra to Build REST APIs in RubyLaunchAny
 
Using and scaling Rack and Rack-based middleware
Using and scaling Rack and Rack-based middlewareUsing and scaling Rack and Rack-based middleware
Using and scaling Rack and Rack-based middlewareAlona Mekhovova
 
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQueryRemedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQueryTatsuhiko Miyagawa
 
Building web framework with Rack
Building web framework with RackBuilding web framework with Rack
Building web framework with Racksickill
 
Fast Web Applications Development with Ruby on Rails on Oracle
Fast Web Applications Development with Ruby on Rails on OracleFast Web Applications Development with Ruby on Rails on Oracle
Fast Web Applications Development with Ruby on Rails on OracleRaimonds Simanovskis
 
Buildr In Action @devoxx france 2012
Buildr In Action @devoxx france 2012Buildr In Action @devoxx france 2012
Buildr In Action @devoxx france 2012alexismidon
 
Using Ruby on Rails with legacy Oracle databases
Using Ruby on Rails with legacy Oracle databasesUsing Ruby on Rails with legacy Oracle databases
Using Ruby on Rails with legacy Oracle databasesRaimonds Simanovskis
 
Your first sinatra app
Your first sinatra appYour first sinatra app
Your first sinatra appRubyc Slides
 
A Toda Maquina Con Ruby on Rails
A Toda Maquina Con Ruby on RailsA Toda Maquina Con Ruby on Rails
A Toda Maquina Con Ruby on RailsRafael García
 
Migrating Legacy Rails Apps to Rails 3
Migrating Legacy Rails Apps to Rails 3Migrating Legacy Rails Apps to Rails 3
Migrating Legacy Rails Apps to Rails 3Clinton Dreisbach
 
Ruby HTTP clients comparison
Ruby HTTP clients comparisonRuby HTTP clients comparison
Ruby HTTP clients comparisonHiroshi Nakamura
 
Datagrids with Symfony 2, Backbone and Backgrid
Datagrids with Symfony 2, Backbone and BackgridDatagrids with Symfony 2, Backbone and Backgrid
Datagrids with Symfony 2, Backbone and Backgrideugenio pombi
 

La actualidad más candente (20)

Ruby on Rails 2.1 What's New
Ruby on Rails 2.1 What's NewRuby on Rails 2.1 What's New
Ruby on Rails 2.1 What's New
 
Ror Seminar With agilebd.org on 23 Jan09
Ror Seminar With agilebd.org on 23 Jan09Ror Seminar With agilebd.org on 23 Jan09
Ror Seminar With agilebd.org on 23 Jan09
 
Using Sinatra to Build REST APIs in Ruby
Using Sinatra to Build REST APIs in RubyUsing Sinatra to Build REST APIs in Ruby
Using Sinatra to Build REST APIs in Ruby
 
Using and scaling Rack and Rack-based middleware
Using and scaling Rack and Rack-based middlewareUsing and scaling Rack and Rack-based middleware
Using and scaling Rack and Rack-based middleware
 
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQueryRemedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
 
Building web framework with Rack
Building web framework with RackBuilding web framework with Rack
Building web framework with Rack
 
Intro to Rack
Intro to RackIntro to Rack
Intro to Rack
 
Intro to PSGI and Plack
Intro to PSGI and PlackIntro to PSGI and Plack
Intro to PSGI and Plack
 
Play vs Rails
Play vs RailsPlay vs Rails
Play vs Rails
 
Fast Web Applications Development with Ruby on Rails on Oracle
Fast Web Applications Development with Ruby on Rails on OracleFast Web Applications Development with Ruby on Rails on Oracle
Fast Web Applications Development with Ruby on Rails on Oracle
 
Plack - LPW 2009
Plack - LPW 2009Plack - LPW 2009
Plack - LPW 2009
 
Buildr In Action @devoxx france 2012
Buildr In Action @devoxx france 2012Buildr In Action @devoxx france 2012
Buildr In Action @devoxx france 2012
 
Plack at YAPC::NA 2010
Plack at YAPC::NA 2010Plack at YAPC::NA 2010
Plack at YAPC::NA 2010
 
Using Ruby on Rails with legacy Oracle databases
Using Ruby on Rails with legacy Oracle databasesUsing Ruby on Rails with legacy Oracle databases
Using Ruby on Rails with legacy Oracle databases
 
Your first sinatra app
Your first sinatra appYour first sinatra app
Your first sinatra app
 
A Toda Maquina Con Ruby on Rails
A Toda Maquina Con Ruby on RailsA Toda Maquina Con Ruby on Rails
A Toda Maquina Con Ruby on Rails
 
Migrating Legacy Rails Apps to Rails 3
Migrating Legacy Rails Apps to Rails 3Migrating Legacy Rails Apps to Rails 3
Migrating Legacy Rails Apps to Rails 3
 
Ruby HTTP clients comparison
Ruby HTTP clients comparisonRuby HTTP clients comparison
Ruby HTTP clients comparison
 
Tatsumaki
TatsumakiTatsumaki
Tatsumaki
 
Datagrids with Symfony 2, Backbone and Backgrid
Datagrids with Symfony 2, Backbone and BackgridDatagrids with Symfony 2, Backbone and Backgrid
Datagrids with Symfony 2, Backbone and Backgrid
 

Similar a Migrating PriceChirp to Rails 3.0: The Pain Points

Intro to Ruby on Rails
Intro to Ruby on RailsIntro to Ruby on Rails
Intro to Ruby on RailsMark Menard
 
[Srijan Wednesday Webinar] Rails 5: What's in It for Me?
[Srijan Wednesday Webinar] Rails 5: What's in It for Me?[Srijan Wednesday Webinar] Rails 5: What's in It for Me?
[Srijan Wednesday Webinar] Rails 5: What's in It for Me?Srijan Technologies
 
Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010Plataformatec
 
Building Mobile Friendly APIs in Rails
Building Mobile Friendly APIs in RailsBuilding Mobile Friendly APIs in Rails
Building Mobile Friendly APIs in RailsJim Jeffers
 
Design Summit - Rails 4 Migration - Aaron Patterson
Design Summit - Rails 4 Migration - Aaron PattersonDesign Summit - Rails 4 Migration - Aaron Patterson
Design Summit - Rails 4 Migration - Aaron PattersonManageIQ
 
Ruby on Rails Security Updated (Rails 3) at RailsWayCon
Ruby on Rails Security Updated (Rails 3) at RailsWayConRuby on Rails Security Updated (Rails 3) at RailsWayCon
Ruby on Rails Security Updated (Rails 3) at RailsWayConheikowebers
 
Application Security from the Inside - OWASP
Application Security from the Inside - OWASPApplication Security from the Inside - OWASP
Application Security from the Inside - OWASPSqreen
 
More to RoC weibo
More to RoC weiboMore to RoC weibo
More to RoC weiboshaokun
 
Rails web api 开发
Rails web api 开发Rails web api 开发
Rails web api 开发shaokun
 
RoR 101: Session 5
RoR 101: Session 5RoR 101: Session 5
RoR 101: Session 5Rory Gianni
 
Staying railsy - while scaling complexity or Ruby on Rails in Enterprise Soft...
Staying railsy - while scaling complexity or Ruby on Rails in Enterprise Soft...Staying railsy - while scaling complexity or Ruby on Rails in Enterprise Soft...
Staying railsy - while scaling complexity or Ruby on Rails in Enterprise Soft...Coupa Software
 
Intro to-rails-webperf
Intro to-rails-webperfIntro to-rails-webperf
Intro to-rails-webperfNew Relic
 
Porting Rails Apps to High Availability Systems
Porting Rails Apps to High Availability SystemsPorting Rails Apps to High Availability Systems
Porting Rails Apps to High Availability SystemsMarcelo Pinheiro
 
Vitta Minicurso Laravel - Hackathon League of Legends
Vitta Minicurso Laravel - Hackathon League of LegendsVitta Minicurso Laravel - Hackathon League of Legends
Vitta Minicurso Laravel - Hackathon League of LegendsFilipe Forattini
 
Burn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websitesBurn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websitesLindsay Holmwood
 

Similar a Migrating PriceChirp to Rails 3.0: The Pain Points (20)

Intro to Ruby on Rails
Intro to Ruby on RailsIntro to Ruby on Rails
Intro to Ruby on Rails
 
[Srijan Wednesday Webinar] Rails 5: What's in It for Me?
[Srijan Wednesday Webinar] Rails 5: What's in It for Me?[Srijan Wednesday Webinar] Rails 5: What's in It for Me?
[Srijan Wednesday Webinar] Rails 5: What's in It for Me?
 
Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010
 
Pyramid deployment
Pyramid deploymentPyramid deployment
Pyramid deployment
 
Building Mobile Friendly APIs in Rails
Building Mobile Friendly APIs in RailsBuilding Mobile Friendly APIs in Rails
Building Mobile Friendly APIs in Rails
 
Supa fast Ruby + Rails
Supa fast Ruby + RailsSupa fast Ruby + Rails
Supa fast Ruby + Rails
 
Rails 4.0
Rails 4.0Rails 4.0
Rails 4.0
 
Design Summit - Rails 4 Migration - Aaron Patterson
Design Summit - Rails 4 Migration - Aaron PattersonDesign Summit - Rails 4 Migration - Aaron Patterson
Design Summit - Rails 4 Migration - Aaron Patterson
 
Ruby on Rails Security Updated (Rails 3) at RailsWayCon
Ruby on Rails Security Updated (Rails 3) at RailsWayConRuby on Rails Security Updated (Rails 3) at RailsWayCon
Ruby on Rails Security Updated (Rails 3) at RailsWayCon
 
Application Security from the Inside - OWASP
Application Security from the Inside - OWASPApplication Security from the Inside - OWASP
Application Security from the Inside - OWASP
 
Basic Rails Training
Basic Rails TrainingBasic Rails Training
Basic Rails Training
 
More to RoC weibo
More to RoC weiboMore to RoC weibo
More to RoC weibo
 
Intro to Rails 4
Intro to Rails 4Intro to Rails 4
Intro to Rails 4
 
Rails web api 开发
Rails web api 开发Rails web api 开发
Rails web api 开发
 
RoR 101: Session 5
RoR 101: Session 5RoR 101: Session 5
RoR 101: Session 5
 
Staying railsy - while scaling complexity or Ruby on Rails in Enterprise Soft...
Staying railsy - while scaling complexity or Ruby on Rails in Enterprise Soft...Staying railsy - while scaling complexity or Ruby on Rails in Enterprise Soft...
Staying railsy - while scaling complexity or Ruby on Rails in Enterprise Soft...
 
Intro to-rails-webperf
Intro to-rails-webperfIntro to-rails-webperf
Intro to-rails-webperf
 
Porting Rails Apps to High Availability Systems
Porting Rails Apps to High Availability SystemsPorting Rails Apps to High Availability Systems
Porting Rails Apps to High Availability Systems
 
Vitta Minicurso Laravel - Hackathon League of Legends
Vitta Minicurso Laravel - Hackathon League of LegendsVitta Minicurso Laravel - Hackathon League of Legends
Vitta Minicurso Laravel - Hackathon League of Legends
 
Burn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websitesBurn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websites
 

Último

My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Wonjun Hwang
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
The Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfThe Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfSeasiaInfotech2
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfRankYa
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 

Último (20)

My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
The Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfThe Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdf
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdf
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 

Migrating PriceChirp to Rails 3.0: The Pain Points

  • 1. Migrating PriceChirp to Rails 3.0 Steven Evatt Blog: http://www.evatt.com/blog Web: http://PriceChirp.com Twitter: @sevatt Houston-RoR Nov 2010 The pain points
  • 2. 2 Today We'll Cover:  Why Upgrade?  Pain points / Issues  Tips  Take Aways
  • 3. 3 Full Disclosure  PriceChirp is my main side project designed to help people (myself included) save money on Amazon  My background is in Perl
  • 4. 4 Why???  Gem ecosystem is starting to require Rails 3.0  Too many deprecation notices
  • 5. 5 How much work was it?  3 weeks of nights / weekends  According to svn  Paths added 67  Paths modified 112  Paths removed 45  Replaced Restful_Authentication with Devise  Converted from Prototype to UJS jQuery
  • 6. 6 Where to start?  Upgrade to Rails 2.3.9  Upgrade Gems  Fix code to remove deprecation message  Bundler  Have test for critical functionality  Install Rails_upgrade plugin  Make a new branch in your source control
  • 7. 7 Source Control  Svn copy http://svn...com/pricechirp/trunk/ http://svn...com/pricechirp/branches/migrate_to_rails 3  Svn checkout http://svn...com/pricechirp/branches/migrate_to_rails 3 migrate
  • 8. 8 Plugin → Rails_upgrade  Documentation out of order and gives wrong syntax for rails command  Mostly run from rails 2.3  Useful rake tasks  Rake rails:upgrade:check  Rake rails:upgrade:backup  Rake rails:upgrade:routes  Rake rails:upgrade:gems  Rake rails:upgrade:configuration
  • 9. 9 Installing Rails 3  Rails new .  Creates a rails3 project with the name of the current directory  If directory name is migrate:  Application name is Migrate::Application  Must update in 12 places to change
  • 10. 10 Bundler  Bundler manages an application's dependencies through its entire life across many machines systematically and repeatably.  Gemfile  gem “rack”, “~>1.1”  gem “rspec, :requires => “spec”  It doesn’t take long before you want to use bundler on all projects
  • 11. 11 Bundler II  Passenger is not ignoring my Gemfile :test, :development block in production  To get bundler to work with capistrano:  Add to deploy.rb: require "bundler/capistrano"
  • 12. 12 Upgrade Gems  gem ‘will_paginate’, ‘~> 3.0.pre2’, :require => ‘will_paginate’  factory_girl_rails => compatibility mode
  • 13. 13 Passenger  Apache configuration changed  from: RailsEnv development  to: RackEnv development
  • 14. 14 Upgrade Plugins  Restful Authentication → Devise  copy crypted_password => encrypted_password  copy salt => encrypted_salt  set confirmed date  nil is a valid salt with Restful Auth, not in Devise  Change helper methods − :login_required → :authenticate_user! − logged_in? → user_signed_in?  Exception_notification
  • 15. 15 RAILS_ENV and RAILS_ROOT  RAILS_ENV → Rails.env  Rails.env.production? − If RAILS_ENV == “production” − If Rails.env.production?  RAILS_ROOT → Rails.root  RAILS_CACHE → Rails.cache
  • 16. 16 XSS protection is everywhere  Learn to love .html_safe.  All strings are not safe until flagged as safe.
  • 17. 17 Views  forms helpers changed from <% to <%=  removed error_messages_for  link_to_remote  Use :remote => true  link_to
  • 18. 18 UJS / jQuery  Converted rjs to erb  Converted from Prototype to jQuery  Get jQuery − http://docs.jquery.com/Downloading_jQuery − /public/javascripts/jquery-1.4.2.min.js  Copy rails.js from github.com/rails/jquery-ujs/raw/master/src/rails.js  :remote => true
  • 19. 19 Active Record Changes  passing options hash containing :conditions, :include, :joins, :limit, :offset, :order, :select, :readonly, :group, :having, :from, :lock to any of the ActiveRecord provided class methods, is now deprecated.  Find → where  find_by_x('xxx') => where(:x => ‘xxx’).first  where(‘b like ?’, value)
  • 20. 20 Active Record “Bug”  select('distinct(x)') is ignored when passed to .count Example Item.where('updated_at < ?', 1.days.ago ).select('distinct(asin)').all Produces the following query: Item Load (6.3ms) SELECT distinct(asin) FROM `items` WHERE (updated_at < '2010-10-16 01:06:05')
  • 21. 21 Active Record “Bug” II Now, when we use .count instead of .all, the .select call is ignored: Item.where('updated_at < ?', 1.days.ago ).select('distinct(asin)').count Yields: SQL (5.4ms) SELECT COUNT(*) AS count_id FROM (SELECT 1 FROM `items` WHERE (updated_at < '2010-10-16 01:09:55')) AS subquery
  • 22. 22 Active Record “Bug” III  Work around Put a .all before the .count Item.where('updated_at < ?', 1.days.ago ).select('distinct(asin)').all.count Issue If you attempt to use :group ie .count(:group => :asin) you get an error  More Info on “bug”  https://rails.lighthouseapp.com/projects/8994/ tickets/5698-select-ignored-in-subquery- when-querying-with-count
  • 23. 23 Custom to_s formatting for dates Example: Time.now.to_s(:js)  From: ActiveSupport::CoreExtensions::Time::Conversions::DATE_FOR MATS.merge!(:js => ‘%m %d, %Y %H:%M:%S’)  To: Time::DATE_FORMATS[:js] = ‘%m %d, %Y %H:%M:%S’
  • 24. 24 Logging Rails.cache Activity  By default, Rails3 does not log Rails.cache activity Cache read: user.default Cache fetch_hit: user.default Cache read: user.count ({:expires_in=>300 seconds}) Cache generate: user.count ({:expires_in=>300 seconds}) Cache write: user.count ({:expires_in=>300 seconds})  To enable logging In environment.rb Rails.cache.logger ||= Rails.logger
  • 25. 25 Action Mailer  Action_mailer defaults to :smtp although everything says it defaults to :sendmail config.action_mailer.delivery_method = :sendmail  Action_mailer requires default_url_options[:host] to be defined config.action_mailer.default_url_options[:host] = { :host => ‘pricechirp.com’ }
  • 26. 26 script/* replaced by script/rails  script/rails replaces all the scripts that used to be in the script directory Safe to remove: about, console, dbconsole, destroy generate, plugin, runner, and server
  • 27. 27 RSS  Had to wrap my “xml.description” output in a CDATA block for it to display <![CDATA[ … ]]>
  • 29. 29 Remove Debugging Statements  logger.info request.inspect Rails 2.3.9 Rails 3.0 request.inspect 5.9k 330k
  • 30. 30 Mime::Type Error: A ActionView::MissingTemplate occurred in pages#index: Missing template pages/index with {:locale=>[:en, :en], :handlers=>[:builder, :erb, :rjs, :rhtml, :rxml], :formats=>[:"text/*"]} in view paths …. actionpack (3.0.1) lib/action_view/paths.rb:15:in `find' Solution: In /config/initializers/mime_types.rb, add: Mime::Type.register “text/*”, :html
  • 31. 31 Current Issues I A ActionController::UnknownHttpMethod occurred in #: PROPFIND, accepted HTTP methods are get, head, put, post, delete, and options actionpack (3.0.1) lib/action_dispatch/http/request.rb:59:in `request_method'
  • 32. 32 Current Issues II Bundler – During a “cap deploy” ... [pricechirp.com] executing command ** [out :: pricechirp.com] (in /home/pricechirp) ** [out :: pricechirp.com] Could not find gem 'rspec-rails (>= 2.0.1, runtime)' in any of the gem sources. ** [out :: pricechirp.com] Try running `bundle install`. command finished *** [deploy:update_code] rolling back ...
  • 33. 33 Take Aways  Upgrade / fix deprecated code as best you can before you start  Use Rails_upgrade plugin  XSS Protection is everywhere  Syntax changes:  Views form helpers  Link_to_remote replaced with :remote => true  Active Record changes: .find → .where  Validate-on-callback  Configurations  There is a lot of deprecated advice out there, remember to check the dates
  • 34. 34 Thanks for Coming! Steven Evatt Email: steven@evatt.com Site: http://PriceChirp.com Blog: http://www.evatt.com/blog Twitter: @sevatt