Screencast: Upgrade auf Rails 3 Teil 2

In dieser Woche zeigt Ryan, im zweiten Teil seiner Serie bzgl. Upgrade auf Rails 3, wie RSpec hinzugefügt bzw. aktualisiert werden kann und geht nochmal auf das rails_upgrade Plugin ein.

 

Download:

Download(40.2 MB, 12:23)
Alternativer Download für iPod & Apple TV(28.6 MB, 12:23)

 

Resourcen:

 

Quellcode:

[bash]
bundle install
rails g rspec:install
rake rails:upgrade:check
rake spec
rails plugin remove rails_upgrade_check
[/bash]

[ruby]
# Gemfile
gem "will_paginate", ">= 3.0.pre2"
group :development, :test do
gem "mocha"
gem "rspec-rails", ">= 2.0.0.beta.19"
gem "factory_girl_rails"
end

# config/application.rb
require ‚yaml‘
APP_CONFIG = YAML.load(File.read(File.expand_path(‚../app_config.yml‘, __FILE__)))
# …
config.autoload_paths += %W(#{Rails.root}/lib)

# models/comment.rb
scope :recent, order("created_at DESC")

# spec_helper.rb
config.include ControllerMacros

# specs
render_view
response.should have_selector(‚title‘, :content => ‚Railscasts Comments‘)

# config/routes.rb
Railscasts::Application.routes.draw do
root :to => "episodes#index"

match "about" => "info#about", :as => "about"
match "contest" => "info#contest", :as => "contest"
match "feeds" => "info#feeds", :as => "feeds"
match "give_back" => "info#give_back", :as => "give_back"
match "login" => "sessions#new", :as => "login"
match "logout" => "sessions#destroy", :as => "logout"

resources :sponsors
resources :comments
resources :tags
resources :episodes do
collection do
get :archive
end
end
resources :sessions
resources :spam_questions
resources :spam_checks
resources :spam_reports do
member do
post :confirm
end
collection do
post :confirm
end
end
end
[/ruby]

Screencast: Upgrade auf Rails 3 Teil 1

Spätestens nachdem nun der erste Release Kandidat für Rails 3 verfügbar ist, sollten die bestehenden Applikationen auf ihre Kompatibilität zur neuen Version geprüft werden.
In einer mehrteiligen Serie wird Ryan zeigen, auf was man achten muss und wie ein Upgrade erfolgen kann. Im ersten Teil wird eine App mit dem Rails 3 RC aufgesetzt und mit dem rails_upgrade Plugin werden die benötigten Updates ermittelt.

 

Download:

Download(35.3 MB, 11:56)
Alternativer Download für iPod & Apple TV(28.2 MB, 11:56)

 

Resourcen:

 

Quellcode:

[bash]
rvm update
rvm reload
rvm install 1.9.2
gem install rails –pre
rvm system
script/plugin install git://github.com/rails/rails_upgrade.git
rails -v
rake rails:upgrade:check
rake rails:upgrade:backup
rvm 1.9.2
rails new . -d mysql
bundle install
rails s
[/bash]

[ruby]
# config/application.rb
class Object
def returning(value)
yield(value)
value
end
end
# …
config.time_zone = ‚Pacific Time (US & Canada)‘

# Gemfile
gem "RedCloth", ">= 4.0", :require => ‚redcloth‘
gem "coderay"
gem "acts_as_list"
gem "will_paginate"
gem "thinking-sphinx", ">= 2.0.0.rc1", :require => ‚thinking_sphinx‘
gem "whenever", :require => false
[/ruby]

Screencast: PDF Dokumente mit PDFKit generieren

PDFs mit Ruby zu erzeugen ist, trotz PDF Toolkit und Prawn, eine langwierige Angelegenheit bzw. kann aufwendig werden. Mit PDFKit können die Dokumente aus HTML-Dateien generiert werden.

 

Download:

Download(18.5 MB, 8:14)
Alternativer Download für iPod & Apple TV(16.8 MB, 8:14)

 

Resourcen:

 

Quellcode:

[bash]
bundle install
rake middleware
[/bash]

[ruby]
# config/application.rb
config.middleware.use "PDFKit::Middleware", :print_media_type => true
[/ruby]

[html]
<!– layouts/application.html.erb –>
<%= stylesheet_link_tag ‚application‘, :media => "all" %>

<!– orders/show.html.erb –>
<p id="pdf_link"><%= link_to "Download Invoice (PDF)", order_path(@order, :format => "pdf") %></p>
[/html]

[css]
/* application.css */
@media print {
body {
background-color: #FFF;
}

#container {
width: auto;
margin: 0;
padding: 0;
border: none;
}

#line_items {
page-break-before: always;
}

#pdf_link {
display: none;
}
}
[/css]

Screencast: Generatoren in Rails 3

In Rails 3 wurden die Generatoren komplett überarbeitet und modularisiert. Auf diese Weise lassen sie sich an die eigenen Anforderngen anpassen. Ryan zeigt in dieser Woche wie man dies machen kann.

 

Download:

Download(43.3 MB, 11:24)
Alternativer Downloadfür iPod & Apple TV(33.7 MB, 11:24)

 

Resourcen:

 

Quellcode:

[bash]
rails g
rails g scaffold –help
rails g scaffold project name:string –no-stylesheets
bundle install
rails g scaffold task project_id:integer
rails g scaffold category name:string
[/bash]

[ruby]
# Gemfile
group :test do
gem "shoulda"
gem "factory_girl"
end

gem "rails3-generators", :group => :development

# config/application.rb
config.generators do |g|
g.stylesheets false
g.test_framework :shoulda
g.fixture_replacement :factory_girl
end
# …
require ‚rails/generators‘
Rails::Generators.fallbacks[:shoulda] = :test_unit
[/ruby]

Screencast: A/B Tests mit A/Bingo

A/B Tests oder Split-Tests werden verwendet um die Akzeptanz einer Applikation in zwei verschiedenen Ausprägungen zu prüfen. In dem heutigen Screencast wird dazu A/Bingo vorgestellt und vorgeführt wie es dazu verwendet werden kann.

 

Download:

Download(35.1 MB, 11:04)
Alternativer Downloadfür iPod & Apple TV(27.6 MB, 11:04)

 

Resourcen:

 

Quellcode:

[bash]
script/plugin install git://git.bingocardcreator.com/abingo.git
script/generate abingo_migration
rake db:migrate
script/generate controller abingo_dashboard
script/plugin install –force git://github.com/ryanb/abingo.git
[/bash]

[ruby]
# users_controller.rb
bingo! "signup_intro"
bingo! "signup_title"
# or
bingo! "signup"

# application_controller.rb
before_filter :set_abingo_identity

private

def set_abingo_identity
if request.user_agent =~ /b(Baidu|Gigabot|Googlebot|libwww-perl|lwp-trivial|msnbot|SiteUptime|Slurp|WordPress|ZIBB|ZyBorg)b/i
Abingo.identity = "robot"
elsif current_user
Abingo.identity = current_user.id
else
session[:abingo_identity] ||= rand(10 ** 10)
Abingo.identity = session[:abingo_identity]
end
end

# abingo_dashboard_controller.rb
class AbingoDashboardController < ApplicationController
# TODO add some authorization
include Abingo::Controller::Dashboard
end

# routes.rb
map.abingo_dashboard "/abingo/:action/:id", :controller=> :abingo_dashboard
[/ruby]

[html]
<% ab_test("signup_title", ["Sign up", "Registration", "Free Sign up"], :conversion => "signup") do |signup_title| %>
<% title "Free Sign up" %>
<% end %>

<% if ab_test "signup_intro", nil, :conversion => "signup" %>
<p>…</p>
<% end %>
[/html]

Screencast: Kalender-Funktion

Es gibt verschiedene Möglichkeiten um einem Benutzer ein Datum auswählen zu lassen oder einen Kalender zu präsentieren. In dieser Woche zeigt Ryan einige Beispiele und Lösungen dafür.

 

Download:

Download(15.6 MB, 9:50)
Alternativer Downloadfür iPod & Apple TV(14.9 MB, 9:50)

 

Resourcen:

 

Quellcode:

[bash]
script/plugin install git://github.com/p8/table_builder.git
[/bash]

[ruby]
# articles_controller.rb
def index
@articles = Article.find(:all)
@date = params[:month] ? Date.parse(params[:month]) : Date.today
endv
[/ruby]

[html]
<!– layouts/application.html.erb –>
<%= stylesheet_link_tag "http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/redmond/jquery-ui.css", "application" %>
<%= javascript_include_tag "http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js", "http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.1/jquery-ui.min.js", "application" %>

<!– articles/index.html.erb –>
<div id="calendar">
<h2 id="month">
<%= link_to "<", :month => (@date.beginning_of_month-1).strftime("%Y-%m") %>
<%=h @date.strftime("%B %Y") %>
<%= link_to ">", :month => (@date.end_of_month+1).strftime("%Y-%m") %>
</h2>
<% calendar_for @articles, :year => @date.year, :month => @date.month do |calendar| %>
<%= calendar.head(‚Sunday‘, ‚Monday‘, ‚Tuesday‘, ‚Wednesday‘, ‚Thursday‘, ‚Friday‘, ‚Saturday‘) %>
<% calendar.day(:day_method => :published_on) do |date, articles| %>
<%= date.day %>
<ul>
<% for article in articles %>
<li><%= link_to h(article.name), article %></li>
<% end %>
</ul>
<% end %>
<% end %>
</div>

<!– articles/_form.html.erb –>
<%= f.text_field :published_on %>
[/html]

[javascript]
// application.js
$(function() {
$("#article_published_on").datepicker();
});
[/javascript]

[css]
#calendar table {
border-collapse: collapse;
width: 100%;
}

#calendar td,
#calendar th {
font-family: "Lucida Grande",arial,helvetica,sans-serif;
font-size: 10px;
padding: 6px;
border: 1px solid #999;
}

#calendar th {
background: #DDD;
color: #666;
text-align: center;
width: 14.2857142857143%;
}

#calendar td {
background: #FFF;
color: #777;
height: 80px;
vertical-align: top;
font-size: 16px;
}

#calendar .notmonth {
color: #CCC;
}

#calendar #month {
margin: 0;
padding-top: 10px;
padding-bottom: 10px;
text-align: center;
}

#calendar #month a, #calendar #month a:hover {
text-decoration: none;
padding: 0 10px;
color: #999;
}

#calendar .today {
background-color: #D7F2FF;
}

#calendar ul {
margin: 0;
margin-top: 5px;
padding: 0;
list-style: none;
}

#calendar li {
margin: 0;
padding: 0;
font-size: 11px;
text-align: center;
}
[/css]

Screencast: Devise anpassen

In dieser Woche zeigt Ryan Devise an die eigenen Bedürfnisse angepasst werden kann. Dabei erklärt er auch wie die Views, das Routing, Validations und Authentication funktionieren.

 

Download:

Download (21.6 MB, 7:52)
Alternativer Download für iPod & Apple TV (16.9 MB, 7:52)

 

Resourcen:

 

Quellcode:

[bash]
rails generate devise_views
rails generate migration add_username_to_users username:string
rake db:migrate
rails c
[/bash]

[ruby]
# projects_controller.rb
before_filter :authenticate_user!, :except => [:show, :index]

# routes.rb
devise_for :users, :path_names => { :sign_up => "register" }

# config/initializers/devise.rb
config.authentication_keys = [ :username ]
config.password_length = 4..20
[/ruby]

[html]
<!– devise/sessions/new.html.erb –>
<% title "Sign in" %>

<%= form_for(resource_name, resource, :url => session_path(resource_name)) do |f| %>
<p><%= f.label :username %><br />
<%= f.text_field :username %></p>

<p><%= f.label :password %><br />
<%= f.password_field :password %></p>

<!– … –>
<% end %>
[/html]

Screencast: Einführung Devise

Devise ist ein Authentifizierungslösung welche jegliche Controller-Logik als auch Views abdeckt. Im dieswöchigen Screencast könnt ihr sehen wie es eingesetzt werden kann.

 

Download:

Download (32.2 MB, 10:36)
Alternative Download fÜr iPod & Apple TV (26.8 MB, 10:36)

 

Resourcen:

 

Quellcode:

[bash]
bundle install
rails generate devise_install
rails generate devise User
rake db:migrate
rake routes
[/bash]

[ruby]
# Gemfile
gem ‚devise‘, ‚1.1.rc0‘

# config/environments/development.rb
config.action_mailer.default_url_options = { :host => ‚localhost:3000‘ }

# models/user.rb
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :token_authenticatable, :lockable, :timeoutable, :confirmable and :activatable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable

# Setup accessible (or protected) attributes for your model
attr_accessible :email, :password, :password_confirmation
end

# migration
class DeviseCreateUsers < ActiveRecord::Migration
def self.up
create_table(:users) do |t|
t.database_authenticatable :null => false
# t.confirmable
t.recoverable
t.rememberable
t.trackable
# t.lockable :lock_strategy => :failed_attempts, :unlock_strategy => :both

t.timestamps
end

add_index :users, :email, :unique => true
# add_index :users, :confirmation_token, :unique => true
add_index :users, :reset_password_token, :unique => true
# add_index :users, :unlock_token, :unique => true
end

def self.down
drop_table :users
end
end

# migration
create_table(:users) do |t|
t.database_authenticatable :null => false
# t.confirmable
t.recoverable
t.rememberable
t.trackable
# t.lockable :lock_strategy => :failed_attempts, :unlock_strategy => :both

t.timestamps
end

add_index :users, :email, :unique => true
# add_index :users, :confirmation_token, :unique => true
add_index :users, :reset_password_token, :unique => true
# add_index :users, :unlock_token, :unique => true
[/ruby]

[html]
<!– layouts/application.html.erb –>
<div id="user_nav">
<% if user_signed_in? %>
Signed in as <%= current_user.email %>. Not you?
<%= link_to "Sign out", destroy_user_session_path %>
<% else %>
<%= link_to "Sign up", new_user_registration_path %> or <%= link_to "sign in", new_user_session_path %>
<% end %>
</div>
[/html]

Screencast: Syntax Highlighting

Syntax Highlighting wird die visuelle Aufbereitung von Source-Code genant. Die meisten Texteditoren unterstützen Syntax Highlighting, aber auch Web wird gerne darauf zurückgegriffen um Quellcode lesbarer zu machen. Ryan zeigt diese Woche wie man in Ruby/Rails-Applikationen um Syntax Highlighting bereichern kann.

 

Download:

Download (30.9 MB, 9:09)
Alternativer Download für iPod & Apple TV (24.4 MB, 9:09)

 

Resourcen:

 

Quellcode:

[html]
<%= textilize(coderay(@article.content)) %>
[/html]

[ruby]
# config/environment.rb
config.gem "coderay"
config.gem "RedCloth"

# application_helper.rb
def coderay(text)
text.gsub(/<code( lang="(.+?)")?>(.+?)</code>/m) do
content_tag("notextile", CodeRay.scan($3, $2).div(:css => :class))
end
end

# syntax_benchmark.rb
require "rubygems"
require "benchmark"
require "coderay"
require "uv"

path = __FILE__
content = File.read(__FILE__)

# run it once to initialize
CodeRay.scan("print ‚hello’", "ruby").div(:css => :class)
Uv.parse("print ‚test’", "xhtml", "ruby", true, "amy")

Benchmark.bm(11) do |b|
b.report("coderay") do
50.times { CodeRay.scan(content, "ruby").div(:css => :class) }
end

b.report("ultraviolet") do
50.times { Uv.parse(content, "xhtml", "ruby", true, "amy") }
end

b.report("pygments") do
50.times { `pygmentize -f html "#{path}"` }
end
end
[/ruby]

[css]
.CodeRay {
background-color: #232323;
border: 1px solid black;
font-family: ‚Courier New‘, ‚Terminal‘, monospace;
color: #E6E0DB;
padding: 3px 5px;
overflow: auto;
font-size: 12px;
margin: 12px 0;
}
.CodeRay pre {
margin: 0px;
padding: 0px;
}

.CodeRay .an { color:#E7BE69 } /* html attribute */
.CodeRay .c { color:#BC9358; font-style: italic; } /* comment */
.CodeRay .ch { color:#509E4F } /* escaped character */
.CodeRay .cl { color:#FFF } /* class */
.CodeRay .co { color:#FFF } /* constant */
.CodeRay .fl { color:#A4C260 } /* float */
.CodeRay .fu { color:#FFC56D } /* function */
.CodeRay .gv { color:#D0CFFE } /* global variable */
.CodeRay .i { color:#A4C260 } /* integer */
.CodeRay .il { background:#151515 } /* inline code */
.CodeRay .iv { color:#D0CFFE } /* instance variable */
.CodeRay .pp { color:#E7BE69 } /* doctype */
.CodeRay .r { color:#CB7832 } /* keyword */
.CodeRay .rx { color:#A4C260 } /* regex */
.CodeRay .s { color:#A4C260 } /* string */
.CodeRay .sy { color:#6C9CBD } /* symbol */
.CodeRay .ta { color:#E7BE69 } /* html tag */
.CodeRay .pc { color:#6C9CBD } /* boolean */
[/css]

Screencast: Bundler

Fast jede Rails/Ruby-Applikation hat Abhängigkeiten zu Bibliotheken und häufig auch zu einer bestimmten Version. Bundler kann solche Abhängigkeiten lösen und kann somit vieles vereinfachen. Ryan zeigt in dieser Woche wie Bundler eingesetzt werden kann.

 

Download:

Download (17 MB, 9:22)
Alternativer Download für iPod & Apple TV (11.7 MB, 9:22)

 

Resourcen:

 

Quellcode:

[bash]
gem install bundler
bundle install
bundle check
bundle help
bundle install –without=test
bundle lock
bundle install –relock
ls ~/.bundle
bundle pack
ls vendor/cache
[/bash]

[ruby]
gem "rails", "3.0.0.beta"
# gem "rails", :git => "git://github.com/rails/rails.git"

gem "sqlite3-ruby", :require => "sqlite3"

# gem "rspec", :group => :test
group :test do
gem "webrat"
end

gem "will_paginate", ">= 2.3.12"
[/ruby]