As developers worldwide have adopted the Ruby on Rails web framework, many have fallen victim to common mistakes that reduce code quality, performance, reliability, stability, scalability, and maintainability. Even experienced developers will find that they can reevaluate the work they've done and make it better.
In this session, Chad Pytel will provide an overview of some of these common mistakes as well as take questions from the audience and provide real-world advice. Bring your issues and get expert advice on how to bring your code in line with today's best practices.
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
Rails Antipatterns | Open Session with Chad Pytel
1. Our Presentation Will Begin Shortly
Rails AntiPatterns
Workshop
May 12, 2011
Matt Reider, Director of Training
Engine Yard
Chad Pytel, Founder & CEO
thoughtbot Inc.
4. What makes them hard to test?
• Scripts that live outside app
• Often have network and file access
• Often have output
5. Example Task
namespace :twitter do
task :search => :environment do
puts "Searching twitter."
Twitter.search("@cpytel").each do |result|
puts "Processing #{result.inspect}."
alert = Alert.create(:body => result)
alert.save_cache_file!
end
end
puts "All done!"
end
15. class Alert < ActiveRecord::Base
def self.create_all_from_twitter_search(output = $stdout)
output.puts "Searching twitter."
Twitter.search("@cpytel").each do |result|
output.puts "Processing #{result.inspect}."
alert = create(:body => result)
alert.save_cache_file!
end
output.puts "All done!"
end
def save_cache_file!
# Removes a file from the filesystem.
end
end
16. The Task is Nice and Skinny
namespace :twitter do
task :search => :environment do
Alert.create_all_from_twitter_search
end
end
17. Testing is Pretty Normal
# test/unit/alert_test.rb
class AlertTest < ActiveSupport::TestCase
context "create_all_from_twitter_search" do
setup do
# Make sure none of the tests below hit the
# network or touch the filesystem.
Alert.any_instance.stubs(:save_cache_file!)
Twitter.stubs(:search).returns([])
@output = StringIO.new
end
18. should "print a message at the beginning" do
Alert.create_all_from_twitter_search(@output)
assert_match /Searching/i, @output.string
end
19. should "save some cache files" do
Twitter.stubs(:search).returns(["one"])
alert = mock("alert")
alert.expects(:save_cache_file!)
Alert.stubs(:create).returns(alert)
Alert.create_all_from_twitter_search(@output)
end
20. should "find all tweets containing @cpytel" do
Twitter.expects(:search).
with("@cpytel").
returns(["body"])
Alert.create_all_from_twitter_search(@output)
end
46. <!-- layouts/application.html.erb -->
<div class="sidebar">
This is content for the sidebar.
<%= link_to "Your Account", account_url %>
</div>
<div class="main">
The main content of the page
</div>
47. <!-- layouts/application.html.erb -->
<%= yield(:sidebar) %>
<div class="main">
The main content of the page
</div>
<!-- layouts/application.html.erb -->
<% content_for :sidebar do %>
<div class="sidebar">
This is content for the sidebar.
<%= link_to "Your Account", account_url %>
</div>
<% end %>
49. <!-- layouts/application.html.erb -->
<div class="sidebar">
<%= yield(:sidebar) %>
</div>
<div class="main">
The main content of the page
</div>
<!-- layouts/application.html.erb -->
<% content_for :sidebar do %>
This is content for the sidebar.
<%= link_to "Your Account", account_url %>
<% end %>
50. Conditional Sidebar
<!-- layouts/application.html.erb -->
<% if content_for?(:sidebar) -%>
<div class="sidebar">
<%= yield(:sidebar) %>
</div>
<% end -%>
<div class="main">
The main content of the page
</div>
<!-- app/views/products/show.html.erb -->
<% content_for :sidebar do %>
This is content for the sidebar.
<%= link_to "Your Account", account_url %>
<% end %>
51. Upcoming Classes
Zero to Rails 3 in four days
•May 23-26
•Virtual
Rails AntiPatterns
•Best Practices
•Boston – June 6 & 7
•San Francisco – June 13 & 14
Learn more at: Engineyard.com/university