Screencast: Bullet

Bullet ist ein Ruby gem das die abgesetzten SQL Befehle analysiert und beim Endecken von Verbesserungspotial den Anwender auf diese hinweist.
Es unterstützt dabei eine Vielzahl an Benachrichtigungsmöglichkeiten.

 

Downloads in verschiedenen Formaten:

mp4
m4v
webm
ogg

 

Resourcen:

terminal

[bash]
rails g migration add_products_count_to_categories products_count:integer
rails g migration cache_products_count
rake db:migrate
[/bash]

Gemfile

[ruby]

gem ‚bullet‘, group: :development
[/ruby]

config/initializers/bullet.rb

[ruby]

if defined? Bullet
Bullet.enable = true
# Bullet.alert = true
Bullet.bullet_logger = true
end
[/ruby]

categories_controller.rb

[ruby]

def index
@categories = Category.order(:name).includes(:products)
end
[/ruby]

db/migrate/cache_products_count.rb

[ruby]

class CacheProductsCount < ActiveRecord::Migration
def up
execute "update categories set products_count=(select count(*) from products where category_id=categories.id)"
end

def down
end
end
[/ruby]

Screencast: MiniProfiler

MiniProfiler erlaubt es sich Geschwindigkeitsmessungen direkt auf der aufgerufenen Seite anzuschauen. Dabei werden auch die aufgerufenen SQL Befehle und wenn gewünscht Messungen für ausgesuchte Code-Blöcke.

 

Downloads in verschiedenen Formaten:

mp4
m4v
webm
ogg

 

Resourcen:

Gemfile

[ruby]

gem ‚rack-mini-profiler‘
[/ruby]

products/index.html.erb

[html]
<%= pluralize project.tasks.size, "task" %>
[/html]

projects_controller.rb

[ruby]

@projects = Project.order(:created_at).select("projects.*, count(tasks.id) as tasks_count").joins("left outer join tasks on project_id=projects.id").group("projects.id")
Rack::MiniProfiler.step("fetch projects") do
@projects.all
end
[/ruby]

config/environments/production.rb

[ruby]

config.serve_static_assets = true
[/ruby]

terminal

[bash]
rake assets:precompile
rake db:setup RAILS_ENV=production
rails s -e production
[/bash]

application_controller.rb

[ruby]

before_filter :miniprofiler

private

def miniprofiler
Rack::MiniProfiler.authorize_request # if user.admin?
end
[/ruby]

Screencast: Diagramme in Rails Applikationen verwenden

Bilder sagen mehr tausend Worte und daher werden oft Diagramme zur Visualisierung von Daten eingesetzt. Ryan zeigt diese Woche wie Highchart für Diagramme und Grafen innerhalb einer Railsapplikation eingesetzt werden kann.

 

Download:

Download(29.1 MB, 16:12)
Alternativer Download für iPod & Apple TV(27.4 MB, 16:12)

 

Resourcen:

 

Quellcode:

[html]
<!– layouts/application.html.erb –>
<%= javascript_include_tag "jquery-1.4.2.min", "rails", "highcharts" %>

<!– orders/index.html.erb –>
<script type="text/javascript" charset="utf-8">
$(function() {
new Highcharts.Chart({
chart: {
renderTo: "orders_chart"
},
title: {
text: "Orders by Day"
},
xAxis: {
type: "datetime"
},
yAxis: {
title: {
text: "Dollars"
}
},
tooltip: {
formatter: function() {
return Highcharts.dateFormat("%B %e, %Y", this.x) + ‚: ‚ +
"$" + Highcharts.numberFormat(this.y, 2);
}
},
series: [
<% { "Download" => Order.download, "Shipping" => Order.shipping }.each do |name, orders| %>
{
name: "<%= name %>",
pointInterval: <%= 1.day * 1000 %>,
pointStart: <%= 3.weeks.ago.to_i * 1000 %>,
data: <%= orders_chart_series(orders, 3.weeks.ago) %>
},
<% end %>
]
});
});
</script>
<div id="orders_chart" style="width:560px; height:300px;"></div>
[/html]

[ruby]
# rails c
Order.group("date(purchased_at)").select("purchased_at, sum(total_price) as total_price").first.total_price.to_f
Order.group("date(purchased_at)").select("purchased_at, sum(total_price) as total_price").first.purchased_at.to_date

# models/order.rb
scope :shipping, where(:shipping => true)
scope :download, where(:shipping => false)

def self.total_on(date)
where("date(purchased_at) = ?", date).sum(:total_price)
end

# orders_helper.rb
def orders_chart_series(orders, start_time)
orders_by_day = orders.where(:purchased_at => start_time.beginning_of_day..Time.zone.now.end_of_day).
group("date(purchased_at)").
select("purchased_at, sum(total_price) as total_price")
(start_time.to_date..Date.today).map do |date|
order = orders_by_day.detect { |order| order.purchased_at.to_date == date }
order && order.total_price.to_f || 0
end.inspect
end
[/ruby]

Screencast: Rails 3 mit Rack

Rack ist die neue Middleware, die in Version 3 einzug in Rails gefunden hat. Mit der Hilfe Rack können Rails-Applikationen neben z.B. Filter, Caches auch um andere Web-Applikationen erweitert bzw. ergänzt werden. Ryan zeigt diese Woche wie Sinatra für Redirects etc. eingesetzt werden kann.

 

Download:

Download(12.1 MB, 8:48)
Alternativer Download für iPod & Apple TV(12 MB, 8:48)

 

Resourcen:

 

Quellcode:

[ruby]
# routes.rb
root :to => "home#index"
root :to => HomeController.action(:index)
root :to => HomeApp

match "/about" => redirect("/aboutus")
match "/aboutus" => "info#about"

resources :products
match "/p/:id" => redirect("/products/%{id}")

match "/processes" => ProcessesApp.action(:index)

# Gemfile
gem "sinatra"

# lib/home_app.rb
class HomeApp < Sinatra::Base
get "/" do
"Hello from Sinatra!"
end
end

# lib/processes_app.rb
class ProcessesApp < ActionController::Metal
include ActionController::Rendering

append_view_path "#{Rails.root}/app/views"

def index
@processes = `ps -axcr -o "pid,pcpu,pmem,time,comm"`
render
end
end
[/ruby]

[html]
<!– app/views/processes_app/index.html.erb –>
<h1>Processes</h1>
<pre><%= @processes %></pre>
[/html]

Die Rails-Entwicklung mit Mongrel beschleunigen

Sie möchten an Ihrem Rails-Projekt im Entwicklungsmodus arbeiten und etwas Schnelleres verwenden als den fest eingebauten Webserver WEBrick.

Lösung

Eine ausgezeichnete Alternative zu WEBrick ist Mongrel. Mongrel ist deutlich schneller als WEBrick und wesentlich einfacher zu installieren als die LightTPD/FastCGI-Kombination. Sie benötigen eine funktionierende Build-Umgebung, um Mongrel unter Linux oder Mac OS X installieren zu können. Windows-Nutzer erhalten ein vorkompiliertes Gem. Nutzer Debian-basierter Linux-Distributionen müssen die ruby-dev– und build-essential-Pakete installiert haben, und Mac OS X-Nutzer müssen Apples XCode-Tools installiert haben. Sobald alle Voraussetzungen erfüllt sind, installieren Sie Mongrel mit Hilfe von RubyGems:

$ sudo gem install mongrel
 
Dann starten Sie Mongrel im Stammverzeichnis der Anwendung als Daemon (als Hintergrundprozess):
$ mongrel_rails start -d
 

Ihre Anwendung ist nun an Port 3000 verfügbar, genau wie bei der WEBrick-Standardeinstellung (http://localhost:3000). Um den Server anzuhalten, geben Sie Folgendes ein:

$ mongrel_rails stop
 

Diskussion

Mongrel ist ein schneller Webserver. Er wurde in Ruby geschrieben (mit einigen C-Erweiterungen). Er ist einfach zu installieren und kann als einfacher Entwicklungsserver dienen. Er kann für größere Produktionsanwendungen aber auch hinter einem Load-Balancer geclustert werden. Mongrel kann auch mit anderen Ruby-Frameworks, wie etwa Og+Nitro und Camping, verwendet werden, ist aber für den Einsatz von Rails-Anwendungen besonders populär. Es ist sehr wahrscheinlich, das script/server in naher Zukunft neben WEBrick und LightTPD auch Mongrel unterstützen wird.

Die Lösung zeigt Mongrel als Daemon-Prozess. Sie können ihn auch im Vordergrund ausführen, erhalten aber nicht die gleichen nützlichen Ausgaben wie bei WEBrick. Um diese Informationen zu erhalten, geben Sie den folgenden Befehl ein:
tail -f log/development.log
 
Die Installation des Mongrel-Plugins fügt den Befehl mongrel_rails in Ihren Pfad ein. Für eine Liste der verfügbaren Optionen geben Sie nur den Befehl ein:
$ mongrel_rails
 
Usage: mongrel_rails <command> [options]

Available commands are:

 - restart

 - start

 - stop



 
Each command takes -h as an option to get help.
 
Mongrel besitzt seinen eigenen Satz von Plugins. Ihre Ausgabe kann anders aussehen, je nachdem, welche Mongrel-Plugins installiert wurden (etwa mongrel_status und mongrel_cluster). Mit dem grundlegenden Mongrel-Gem verfügen Sie über start, stop und restart.

Eine vollständige Liste der Optionen des start-Befehls erhalten Sie mit -h:
$ mongrel_rails start -h
 
Usage: mongrel_rails <command> [options]

    -e, --environment ENV            Rails environment to run as

    -d, --daemonize                  Whether to run in the background or 

                                     not

    -p, --port PORT                  Which port to bind to

    -a, --address ADDR               Address to bind to

    -l, --log FILE                   Where to write log messages

    -P, --pid FILE                   Where to write the PID

    -n, --num-procs INT              Number of processors active before 

                                     clients denied

    -t, --timeout TIME               Timeout all requests after 100th 

                                     seconds time

    -m, --mime PATH                  A YAML file that lists additional 

                                     MIME types

    -c, --chdir PATH                 Change to dir before starting 

                                     (will be expanded) -r, --root PATH

                                     Set the document root (default 

                                     'public')

    -B, --debug                      Enable debugging mode

    -C, --config PATH                Use a config file

    -S, --script PATH                Load the given file as an extra 

                                     config script.

    -G, --generate CONFIG            Generate a config file for -C

        --user USER                  User to run as

        --group GROUP                Group to run as

    -h, --help                       Show this message

         --version                   Show version

 
Wenn Sie mit Windows arbeiten, können Sie Mongrel einfach als Dienst konfigurieren:
$ mongrel_rails_service install -n blog -r c:datablog 
 
                                -p 4000 -e production
 
Sie starten den Dienst dann mit:
$ mongrel_rails_service start -n blog
 
Sie können den Dienst sogar über die Verwaltung in der Systemsteuerung pflegen.

Dieses Rezept stammt aus dem Rails Kochbuch, veröffentlicht beim O’Reilly Verlag