SlideShare a Scribd company logo
1 of 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

More Related Content

What's hot

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
 

What's hot (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 to 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 to 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
 

Recently uploaded

CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024The Digital Insurer
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsRoshan Dwivedi
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 

Recently uploaded (20)

CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 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