Agile Web Development with Rails, Edition 4
Agile Web Development with Rails, Edition 4
25.1 rack
22 Caching
24.3 Active Resources
Turn off strict sanitization
edit config/environments/development.rb
Depot::Application.configure do
# Settings specified here will take precedence over those in config/application.rb
# In the development environment your application's code is reloaded on
# every request. This slows down response time but is perfect for development
# since you don't have to restart the web server when you make code changes.
config.cache_classes = false
# Log error messages when you accidentally call methods on nil.
config.whiny_nils = true
# Show full error reports and disable caching
config.consider_all_requests_local = true
config.action_controller.perform_caching = true
# Don't care if the mailer can't send
config.action_mailer.raise_delivery_errors = false
# Don't actually send emails
config.action_mailer.delivery_method = :test
#
# Alternate configuration example, using gmail:
# config.action_mailer.delivery_method = :smtp
# config.action_mailer.smtp_settings = {
# address: "smtp.gmail.com",
# port: 587,
# domain: "domain.of.sender.net",
# authentication: "plain",
# user_name: "dave",
# password: "secret",
# enable_starttls_auto: true
# }
# Print deprecation notices to the Rails logger
config.active_support.deprecation = :log
# Only use best-standards-support built into browsers
config.action_dispatch.best_standards_support = :builtin
# Raise exception on mass assignment protection for Active Record models
config.active_record.mass_assignment_sanitizer = :logger
# Log the query plan for queries taking more than this (works
# with SQLite, MySQL, and PostgreSQL)
config.active_record.auto_explain_threshold_in_seconds = 0.5
# Do not compress assets
config.assets.compress = false
# Expands the lines which load the assets
config.assets.debug = true
end
Restart the server.
bundle exec /home/rubys/git/rails/railties/bin/rails new depot_client --skip-bundle --dev
create
create README.rdoc
create Rakefile
create config.ru
create .gitignore
create Gemfile
create app
create app/assets/images/rails.png
create app/assets/javascripts/application.js
create app/assets/stylesheets/application.css
create app/controllers/application_controller.rb
create app/helpers/application_helper.rb
create app/mailers
create app/models
create app/views/layouts/application.html.erb
create app/mailers/.gitkeep
create app/models/.gitkeep
create config
create config/routes.rb
create config/application.rb
create config/environment.rb
create config/environments
create config/environments/development.rb
create config/environments/production.rb
create config/environments/test.rb
create config/initializers
create config/initializers/backtrace_silencers.rb
create config/initializers/inflections.rb
create config/initializers/mime_types.rb
create config/initializers/secret_token.rb
create config/initializers/session_store.rb
create config/initializers/wrap_parameters.rb
create config/locales
create config/locales/en.yml
create config/boot.rb
create config/database.yml
create db
create db/seeds.rb
create doc
create doc/README_FOR_APP
create lib
create lib/tasks
create lib/tasks/.gitkeep
create lib/assets
create lib/assets/.gitkeep
create log
create log/.gitkeep
create public
create public/404.html
create public/422.html
create public/500.html
create public/favicon.ico
create public/index.html
create public/robots.txt
create script
create script/rails
create test/fixtures
create test/fixtures/.gitkeep
create test/functional
create test/functional/.gitkeep
create test/integration
create test/integration/.gitkeep
create test/unit
create test/unit/.gitkeep
create test/performance/browsing_test.rb
create test/test_helper.rb
create tmp/cache
create tmp/cache/assets
create vendor/assets/javascripts
create vendor/assets/javascripts/.gitkeep
create vendor/assets/stylesheets
create vendor/assets/stylesheets/.gitkeep
create vendor/plugins
create vendor/plugins/.gitkeep
bundle install
Using rake (0.9.2.2)
Using i18n (0.6.1)
Using multi_json (1.3.6)
Using activesupport (3.2.8)
Using builder (3.0.3)
Using activemodel (3.2.8)
Using erubis (2.7.0)
Using journey (1.0.4.20120614141756)
Using rack (1.4.1)
Using rack-cache (1.2)
Using rack-test (0.6.2)
Using hike (1.2.1)
Using tilt (1.3.3)
Using sprockets (2.7.0)
Using actionpack (3.2.8)
Using mime-types (1.19)
Using polyglot (0.3.3)
Using treetop (1.4.11)
Using mail (2.4.4)
Using actionmailer (3.2.8)
Using arel (3.0.2.20120221150532)
Using tzinfo (0.3.33)
Using activerecord (3.2.8)
Using activeresource (3.2.8)
Using bundler (1.2.0)
Using coffee-script-source (1.3.3)
Using execjs (1.4.0)
Using coffee-script (2.2.0)
Using rack-ssl (1.3.2)
Using json (1.7.5)
Using rdoc (3.12)
Using thor (0.16.0)
Using railties (3.2.8)
Using coffee-rails (3.2.2)
Using jquery-rails (2.1.3)
Using rails (3.2.8)
Using sass (3.2.1)
Using sass-rails (3.2.5)
Using sqlite3 (1.3.6)
Using uglifier (1.3.0)
Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed.
edit app/models/product.rb
class Product < ActiveResource::Base
self.site = 'http://dave:secret@localhost:3000/'
end
echo "Product.find(2).title" | IRBRC=tmp/irbrc rails console
Loading development environment (Rails 3.2.8)
>> Product.find(2).title
=> "CoffeeScript"
>>
edit app/controllers/line_items_controller.rb
def create
@cart = current_cart
if params[:line_item]
# ActiveResource
params[:line_item][:order_id] = params[:order_id]
@line_item = LineItem.new(params[:line_item])
else
# HTML forms
product = Product.find(params[:product_id])
@line_item = @cart.add_product(product.id)
end
@line_item.product = product
respond_to do |format|
if @line_item.save
format.html { redirect_to store_url }
format.js { @current_item = @line_item }
format.json { render :json => @line_item,
:status => :created, :location => @line_item }
else
format.html { render :action => "new" }
format.json { render :json => @line_item.errors,
:status => :unprocessable_entity }
end
end
end
edit config/routes.rb
Depot::Application.routes.draw do
get 'admin' => 'admin#index'
controller :sessions do
get 'login' => :new
post 'login' => :create
delete 'logout' => :destroy
end
scope '(:locale)' do
resources :users
resources :orders do
resources :line_items
end
resources :line_items
resources :carts
resources :products do
get :who_bought, :on => :member
end
root :to => 'store#index', :as => 'store'
end
end
echo "Product.find(2).title" | IRBRC=tmp/irbrc rails console
Loading development environment (Rails 3.2.8)
>> Product.find(2).title
=> "CoffeeScript"
>>
echo "p = Product.find(2)\\nputs p.price\\np.price = BigDecimal.new(p.price)-5\\np.save" | IRBRC=tmp/irbrc rails console
Loading development environment (Rails 3.2.8)
>> p = Product.find(2)
=> #<Product:0x7f500e3ede50 @attributes={"price"=>"36.0", "created_at"=>"2012-10-11T07:11:35Z", "image_url"=>"cs.jpg", "title"=>"CoffeeScript", "updated_at"=>"2012-10-11T07:11:35Z", "id"=>2, "description"=>"<p>\n CoffeeScript is JavaScript done right. It provides all of JavaScript's\n\tfunctionality wrapped in a cleaner, more succinct syntax. In the first\n\tbook on this exciting new language, CoffeeScript guru Trevor Burnham\n\tshows you how to hold onto all the power and flexibility of JavaScript\n\twhile writing clearer, cleaner, and safer code.\n </p>"}, @persisted=true, @prefix_options={}>
>> puts p.price
36.0
=> nil
>> p.price = BigDecimal.new(p.price)-5
=> #<BigDecimal:7f500e3e1538,'0.31E2',9(27)>
>> p.save
=> true
>>
expire cache
rm -rf /home/rubys/git/awdwr/edition4/work-187/depot/tmp/cache
fetch storefront
get /
Pragmatic Bookshelf
Your Pragmatic Catalog
CoffeeScript
CoffeeScript is JavaScript done right. It provides all of JavaScript's
functionality wrapped in a cleaner, more succinct syntax. In the first
book on this exciting new language, CoffeeScript guru Trevor Burnham
shows you how to hold onto all the power and flexibility of JavaScript
while writing clearer, cleaner, and safer code.
Programming Ruby 1.9
Ruby is the fastest growing and most exciting dynamic language
out there. If you need to get working programs delivered fast,
you should add Ruby to your toolbox.
Rails Test Prescriptions
Rails Test Prescriptions is a comprehensive guide to testing
Rails applications, covering Test-Driven Development from both a
theoretical perspective (why to test) and from a practical perspective
(how to test effectively). It covers the core Rails testing tools and
procedures for Rails 2 and Rails 3, and introduces popular add-ons,
including Cucumber, Shoulda, Machinist, Mocha, and Rcov.
fetch product (fallback in case storefront is cached)
get /login
Pragmatic Bookshelf
post /login?locale=en
name => dave
password => secret
You are being
redirected .
get http://localhost:3000/admin?locale=en
Pragmatic Bookshelf
Welcome
It's Thu Oct 11 03:21:48 -0400 2012
We have 102 orders.
get /products/2
Pragmatic Bookshelf
Title:
CoffeeScript
Description:
<p>
CoffeeScript is JavaScript done right. It provides all of JavaScript's
functionality wrapped in a cleaner, more succinct syntax. In the first
book on this exciting new language, CoffeeScript guru Trevor Burnham
shows you how to hold onto all the power and flexibility of JavaScript
while writing clearer, cleaner, and safer code.
</p>
Image url:
cs.jpg
Price:
31.0
Edit |
Back
edit app/models/order.rb
class Order < ActiveResource::Base
self.site = 'http://dave:secret@localhost:3000/'
end
echo "Order.find(1).name\\nOrder.find(1).line_items\\n" | IRBRC=tmp/irbrc rails console
Loading development environment (Rails 3.2.8)
>> Order.find(1).name
=> "Dave Thomas"
>> Order.find(1).line_items
NoMethodError: undefined method `line_items' for #<Order:0x7fd4bbc6b280>
from /home/rubys/git/rails/activeresource/lib/active_resource/base.rb:1470:in `method_missing'
from (irb):2
>>
edit app/models/line_item.rb
class LineItem < ActiveResource::Base
self.site = 'http://dave:secret@localhost:3000/orders/:order_id'
end
post /logout?locale=en
You are being
redirected .
get http://localhost:3000/en
Pragmatic Bookshelf
Logged out
Your Pragmatic Catalog
CoffeeScript
CoffeeScript is JavaScript done right. It provides all of JavaScript's
functionality wrapped in a cleaner, more succinct syntax. In the first
book on this exciting new language, CoffeeScript guru Trevor Burnham
shows you how to hold onto all the power and flexibility of JavaScript
while writing clearer, cleaner, and safer code.
Programming Ruby 1.9
Ruby is the fastest growing and most exciting dynamic language
out there. If you need to get working programs delivered fast,
you should add Ruby to your toolbox.
Rails Test Prescriptions
Rails Test Prescriptions is a comprehensive guide to testing
Rails applications, covering Test-Driven Development from both a
theoretical perspective (why to test) and from a practical perspective
(how to test effectively). It covers the core Rails testing tools and
procedures for Rails 2 and Rails 3, and introduces popular add-ons,
including Cucumber, Shoulda, Machinist, Mocha, and Rcov.
echo "LineItem.find(:all, :params => {:order_id=>1})" | IRBRC=tmp/irbrc rails console
Loading development environment (Rails 3.2.8)
>> LineItem.find(:all, :params => {:order_id=>1})
=> [#<LineItem:0x7f20a60bab80 @attributes={"price"=>"36.0", "created_at"=>"2012-10-11T07:14:47Z", "quantity"=>1, "product_id"=>2, "updated_at"=>"2012-10-11T07:15:28Z", "id"=>7, "cart_id"=>nil}, @prefix_options={:order_id=>1}, @persisted=true>, #<LineItem:0x7f20a60b6418 @attributes={"price"=>"36.0", "created_at"=>"2012-10-11T07:18:44Z", "quantity"=>2, "product_id"=>2, "updated_at"=>"2012-10-11T07:18:58Z", "id"=>8, "cart_id"=>nil}, @prefix_options={:order_id=>1}, @persisted=true>]
>>
get /orders/1/line_items.json
[{"price":"36.0","created_at":"2012-10-11T07:14:47Z","quantity":1,"product_id":2,"updated_at":"2012-10-11T07:15:28Z","order_id":1,"id":7,"cart_id":null},{"price":"36.0","created_at":"2012-10-11T07:18:44Z","quantity":2,"product_id":2,"updated_at":"2012-10-11T07:18:58Z","order_id":102,"id":8,"cart_id":null}]
edit app/controllers/line_items_controller.rb
def index
@line_items = LineItem.all
respond_to do |format|
format.html # index.html.erb
format.json { render :json => @line_items }
format.xml { render :xml => @line_items }
end
end
get /orders/1/line_items.xml
<?xml version="1.0" encoding="UTF-8"?>
<line-items type="array">
<line-item>
<price type="decimal">36.0</price>
<created-at type="datetime">2012-10-11T07:14:47Z</created-at>
<quantity type="integer">1</quantity>
<product-id type="integer">2</product-id>
<updated-at type="datetime">2012-10-11T07:15:28Z</updated-at>
<order-id type="integer">1</order-id>
<id type="integer">7</id>
<cart-id type="integer" nil="true"/>
</line-item>
<line-item>
<price type="decimal">36.0</price>
<created-at type="datetime">2012-10-11T07:18:44Z</created-at>
<quantity type="integer">2</quantity>
<product-id type="integer">2</product-id>
<updated-at type="datetime">2012-10-11T07:18:58Z</updated-at>
<order-id type="integer">102</order-id>
<id type="integer">8</id>
<cart-id type="integer" nil="true"/>
</line-item>
</line-items>
echo "LineItem.format = :xml\\nli = LineItem.find(:all, :params => {:order_id=>1}).first\\nputs li.price\\nli.price *= 0.8\\nli.save" | IRBRC=tmp/irbrc rails console
Loading development environment (Rails 3.2.8)
>> LineItem.format = :xml
=> :xml
>> li = LineItem.find(:all, :params => {:order_id=>1}).first
=> #<LineItem:0x7f9afd285a10 @attributes={"price"=>#<BigDecimal:7f9afd28e7c8,'0.36E2',9(18)>, "created_at"=>Thu Oct 11 07:14:47 UTC 2012, "product_id"=>2, "quantity"=>1, "updated_at"=>Thu Oct 11 07:15:28 UTC 2012, "id"=>7, "cart_id"=>nil}, @persisted=true, @prefix_options={:order_id=>1}>
>> puts li.price
36.0
=> nil
>> li.price *= 0.8
=> 28.8
>> li.save
ActiveResource::ClientError: Failed. Response code = 406. Response message = Not Acceptable .
from /home/rubys/git/rails/activeresource/lib/active_resource/connection.rb:146:in `handle_response'
from /home/rubys/git/rails/activeresource/lib/active_resource/connection.rb:115:in `request'
from /home/rubys/git/rails/activeresource/lib/active_resource/connection.rb:92:in `put'
from /home/rubys/git/rails/activeresource/lib/active_resource/connection.rb:218:in `with_auth'
from /home/rubys/git/rails/activeresource/lib/active_resource/connection.rb:92:in `put'
from /home/rubys/git/rails/activeresource/lib/active_resource/base.rb:1353:in `update_without_notifications'
from /home/rubys/git/rails/activeresource/lib/active_resource/observing.rb:19:in `update'
from /home/rubys/git/rails/activeresource/lib/active_resource/base.rb:1155:in `save_without_validation'
from /home/rubys/git/rails/activeresource/lib/active_resource/validations.rb:79:in `save_without_notifications'
from /home/rubys/git/rails/activeresource/lib/active_resource/observing.rb:19:in `save'
from (irb):5
>>
echo "li2 = LineItem.new(:order_id=>1, :product_id=>2, :quantity=>1, :price=>0.0)\\nli2.save" | IRBRC=tmp/irbrc rails console
Loading development environment (Rails 3.2.8)
>> li2 = LineItem.new(:order_id=>1, :product_id=>2, :quantity=>1, :price=>0.0)
=> #<LineItem:0x7f253f95bdf0 @attributes={"price"=>0.0, "quantity"=>1, "product_id"=>2}, @prefix_options={:order_id=>1}, @persisted=false>
>> li2.save
=> true
>>
25.1 rack
22 Caching