Screencast: Update auf Rails 3.1

Nachdem nun Rails 3.1 letzte Woche erschienen ist, werden einige, wenn möglich, Ihre aktuellen Applikationen auf die neue Version heben. Dies ist relativ einfach und ohne viel Aufwand erledigt. Somit kann man sehr schnell die neuen Funktionen wie zum Beispiel die Asset Pipeline nutzen. Ryan zeigt in dieser Woche wie das Update durchgeführt und die entsprechenden Konfigurationen setzt.

 

Downloads in verschiedenen Formaten:

mp4
mp4
webm
ogg

 

Resourcen:

Gemfile

[ruby]
gem "rails", "3.1.0"

# Gems used only for assets and not required
# in production environments by default.
group :assets do
gem ’sass-rails‘, " ~> 3.1.0"
gem ‚coffee-rails‘, "~> 3.1.0"
gem ‚uglifier‘
end

gem ‚jquery-rails‘
[/ruby]

config/application.rb

[ruby]
if defined?(Bundler)
# If you precompile assets before deploying to production, use this line
Bundler.require *Rails.groups(:assets => %w(development test))
# If you want your assets lazily compiled in production, use this line
# Bundler.require(:default, :assets, Rails.env)
end

# …

# Enable the asset pipeline
config.assets.enabled = true

# Version of your assets, change this if you want to expire all your assets
config.assets.version = ‚1.0‘
[/ruby]

config/environments/development.rb

[ruby]
# comment out this line:
# config.action_view.debug_rjs = true

# Do not compress assets
config.assets.compress = false

# Expands the lines which load the assets
config.assets.debug = true
[/ruby]

config/environments/test.rb

[ruby]
# Configure static asset server for tests with Cache-Control for performance
config.serve_static_assets = true
config.static_cache_control = "public, max-age=3600"

# Allow pass debug_assets=true as a query parameter to load pages with unpackaged assets
config.assets.allow_debugging = true
[/ruby]

config/environments/production.rb

[ruby]
# Compress JavaScripts and CSS
config.assets.compress = true

# Don’t fallback to assets pipeline if a precompiled asset is missed
config.assets.compile = false

# Generate digests for assets URLs
config.assets.digest = true
[/ruby]

views/layouts/application.html.erb

[html]
<%= stylesheet_link_tag "application" %>
<%= javascript_include_tag "application" %>
[/html]

.gitignore

[bash]
.sass-cache/
[/bash]

app/assets/javascripts/application.js

[javascript]
//= require jquery
//= require jquery_ujs
//= require_self
//= require_tree .
[/javascript]

app/assets/stylesheets/application.css

[css]
/*
*= require_self
*= require_tree .
*/
[/css]

Rails 3.1 veröffentlicht

Wie bereits gestern angekündigt wurde soeben die lang erwartete Rails-Version 3.1 veröffentlicht. Neben den offensichtlichen Neuerungen wie z.B. der Asset-Pipeline, wurde auch wieder die Geschwindigkeit verbessert und Helfer hinzugefügt um die Entwicklung zu vereinfachen.

Dies sind einige der Highlights in diesem Release:

ActionPack

  • ActionPack wurde um die neue Asset Pipeline erweitert Weitere Details: rails guides on the asset pipeline.
  • Streaming wird nun unterstützt. Somit lassen sich generierte Teile sofort zum Client schicken ohne, dass erst die ganze Seite fertig gestellt werden muss.
  • RJS wurde in ein Gem ausgelagert.

ActiveModel

  • attr_accessible akzeptiert nun :as als Option um eine Rolle zu spezifizieren
  • ActiveModel::SecurePassword wurde für sicherere Passwörter hinzugefügt.

ActiveRecord

  • Prepared Statement Caches sind nun in ActiveRecord::Base#create integriert.
  • Associations wurden überarbeitet.
  • default_scope kann nun alle Objekte aufnehmen die die Methode call implementiert haben.
  • Der PostgreSQL Adapter unterstützt nu PostgreSQL in Version 8.2 un neuer.
  • Migrations können nun Rückgängig gemacht werden.
  • Wenn ein Model generiert wird, wird add_index standardmäßig für belongs_to oder references Spalten hinzugefügt.

ActiveResource

  • Das Standardrückgabeformat ist nun JSON.

ActiveSupport

  • ActiveSupport::BufferedLogger setzt nun das Encoding auf BINARY.
  • Mit Object#in?  kann nun getestet werden ob ein Objekt in einem anderen Objekt ist.
  • ActiveSupport::Dependencies::ClassCache hält nun eine Referenz auf erneut ladbare Klassen.
  • weeks_ago und prev_week wurden zu Date/DateTime/Time hinzugefügt.
  • JSON Decoding verwendet nun das multi_json gem which.

Railties

  • UTF-8 wird nun als Standard für DB-Schemas verwendet.
  • Rack::Sendfile Middleware kommt nur zum Einsatz wenn x_sendfile_header gesetzt wurde.
  • Das Alias r für den rails runner ist hinzugekommen.
  • jQuery ist nun die Standard JavaScript Bibliothek.
  • Mit config.force_ssl kann nun eine sichere Verbindung erzwunden werden.

Letzter Release Candidate für Rails 3.1 (3.1.0rc8)

Soeben wurde ein weiterer Release Candidate für Rails 3.1 veröffentlicht. Wenn keine Probleme auftreten, wird morgen 30. August die finale Version veröffentlicht.

Die Liste der Veränderung zum vorherigen Release sind wie immer im Changelog vermerkt: https://github.com/rails/rails/compare/v3.1.0.rc6…v3.1.0.rc8

Screencast: Asset Pipeline Grundlagen

Einer der großen Neuerungen in Rails 3.1 ist die Asset Pipeline. Die Asset Pipeline unterstützt bei der Entwicklung von CSS und JavaScripts, indem Tasks wie Minify, Coffeescript-Kompilierung, etc. ein integraler Teil des Frameworks geworden ist. Wie es benutzt wird und welche Vorteile es bietet zeigt Ryan in dieser Woche in seinem Screencast.

 

Downloads in verschiedenen Formaten:

source code
mp4
m4v
webm
ogv

 

Resourcen:

bash

[bash]
bundle open jquery-rails
rails s -e production
rake assets:precompile
[/bash]

app/assets/anything/greeting.txt.erb

[html]
Hello world <%= 1 + 1 %>!
[/html]

app/assets/javascripts/application.js

[javascript]
//= require jquery
//= require jquery_ujs
//= require jquery-ui
//= require_tree ./public
// or
//= require_directory .
[/javascript]

app/assets/javascripts/admin/categories.js.coffee

[javascript]
alert("hello!")
[/javascript]

Screencast: Mountbare Engines

Engines kommen in Rails 3.1 wieder „zurück“ bzw. sie wurden überarbeitet und bieten nun mehr Möglichkeiten als noch in Rails 2.

Downloads in verschiedenen Formaten:

source code

mp4

m4v

webm

ogv

Resourcen:

bash

[bash]
rails -v
rails plugin new uhoh –mountable
rails g controller failures index
rails g model failure message:text
rake db:migrate
rake uhoh:install:migrations
cd test/dummy
rails g controller simulate failure
[/bash]

uhoh/failures_controller.rb

[ruby]
module Uhoh
class FailuresController < ApplicationController
def index
@failures = Failure.all
end
end
end
[/ruby]

uhoh/failures/index.html.erb

[html]
<h1>Failures</h1>
[/html]

config/routes.rb

[ruby]
root :to => "failures#index"
[/ruby]

config/initializers/exception_handler.rb

[ruby]
ActiveSupport::Notifications.subscribe "process_action.action_controller" do |name, start, finish, id, payload|
if payload[:exception]
name, message = *payload[:exception]
Uhoh::Failure.create!(:message => message)
end
end
[/ruby]

test/dummy/config/routes.rb

[ruby]
mount Uhoh::Engine => "/uhoh", :as => "uhoh_engine"
[/ruby]

test/dummy/app/controllers/simulate_controller.rb

[ruby]
def failure
# redirect_to uhoh_engine.root_url
raise "Simulating an exception"
end
[/ruby]

Screencast: Authentifizierung in Rails 3.1

Rails 3.1 steht kurz vor der Veröffentlichung und daher gibt es diese Woche einen weiteren Screencast dazu. Authentifizierung über HTTP Basic, sichere Passwörter in Datenbanken und SSL sind die Themen die Ryan in dieser Woche vorstellt und wie diese ganz einfach in Rails 3.1 realisiert werden können.

 

Downloads in verschiedenen Formaten:

source code
mp4
m4v
webm
ogv

 

Resourcen:

bash

[bash]
rails g model user email:string password_digest:string
rails s -e production
[/bash]

secret_controller.rb

[ruby]
http_basic_authenticate_with :name => "frodo", :password => "thering"
[/ruby]

models/user.rb

[ruby]
class User < ActiveRecord::Base
attr_accessible :email, :password, :password_confirmation
has_secure_password
validates_presence_of :password, :on => :create
end
[/ruby]

sessions_controller.rb

[ruby]
def create
user = User.find_by_email(params[:email])
if user && user.authenticate(params[:password])
session[:user_id] = user.id
redirect_to root_url, :notice => "Logged in!"
else
flash.now.alert = "Invalid email or password"
render "new"
end
end

def destroy
session[:user_id] = nil
redirect_to root_url, :notice => "Logged out!"
end
[/ruby]

application_controller.rb

[ruby]
force_ssl

private

def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
helper_method :current_user
[/ruby]

Screencast: Vererbung von Templates

Teile von Templates wieder zu verwenden wurde bisher größtenteils über partials verwirklicht. In Rails 3.1 wird es möglich sein Templates zu vererben. So können Teile von Views auf allgemein gültige zurückgreifen und darstellen. Ryan zeigt diese Woche wie in einer Applikation ein Template von allen Views genutzt und wie es im Zusamenhang mit Subdomains eingesetzt werden kann.

 

Downloads in verschiedenen Formaten:

source code
mp4
m4v
webm
ogv

 

Resourcen:

application_controller.rb

[ruby]
before_filter :subdomain_view_path

private

def subdomain_view_path
prepend_view_path "app/views/#{request.subdomain}_subdomain" if request.subdomain.present?
end
[/ruby]

views/layouts/application.html.erb

[html]
<%= render "side" %>
[/html]

views/application/_side.html.erb

[html]
<strong>Pages</strong>
<ul>
<li><%= link_to "Home", root_path %></li>
<li><%= link_to "Products", products_path %></li>
</ul>
[/html]

views/admin/base/_side.html.erb

[html]
<strong>Pages</strong>
<ul>
<li><%= link_to "Home", root_path %></li>
<li><%= link_to "Products", products_path %></li>
<li><%= link_to "Manage Products", admin_products_path %></li>
<li><%= link_to "Manage Categories", admin_categories_path %></li>
</ul>
[/html]

views/mobile_subdomain/products/index.html.erb

[html]
<h1>Mobile Version</h1>
[/html]

edit.html.erb

[html]
<%= controller.view_paths %>
[/html]

Screencast: Sass Basiswissen

Sass ist neben CoffeeScript eine der Neuerungen die mit Rails 3.1 kommen werden. Sass ermöglicht die Entwicklung von Cascading Stylesheets (CSS) mit der Eweiterung, dass Ruby-Code in die Stylesheets eingebettet werden können. Somit lassen sich Variablen und Funktionen für die vereinfachte Erstellung nutzen. Weiterhin werden auch Tools zum Komprimieren mitgeliefert, um die generierten Dateien möglichst klein zu halten.

 

Downloads in verschiedenen Formaten:

source code
mp4
m4v
webm
ogv

 

Resourcen:

[css]
/*
*= require_self
*/
@import "layout.css.scss";
@import "projects.css.scss";
[/css]

[css]
$main-color: #1E7B12;

@mixin rounded-corners($radius) {
border-radius: $radius;
-moz-border-radius: $radius;
-webkit-border-radius: $radius;
}

body {
margin: 0;
padding: 0;
background-color: #FFF;
font-family: verdana;
font-size: 14px;
}

#header {
background-color: $main-color;
color: #FFF;
padding: 4px 100px;
border-bottom: solid 5px darken($main-color, 10%);

h1 {
font-size: 30px;
}
}

a {
color: $main-color;
text-decoration: none;
&:hover {
text-decoration: underline;
}
}

#container {
margin: 0 100px;
}
[/css]

[css]
#projects_controller {
.new_project {
background-color: $main-color;
color: #FFF;
padding: 5px 12px;
margin: 10px 0;
font-size: 16px;
@include rounded-corners(5px);
}

.project {
border: solid 1px #777;
margin: 20px 0;
padding: 7px 12px;
@include rounded-corners(10px);
}

.project h2 {
margin: 0;
}
}
[/css]

Screencast: CoffeeScript Basiswissen

CoffeeScript, einer der Neuerungen in Rails 3.1, ist eine Programmier-Sprache zur Generierung von JavaScript. Es will die JavaScript-Entwicklung erleichtern, indem es unnötige Anweisungen entfernt und somit eine kompaktere Entwicklung zulässt. Um einen Vorgeschmack über die Möglichkeiten zu bekommen, hat Ryan diese Woche seinen Screencast, dem Basiswissen zu CoffeeScript gewidmet. Er zeigt wie es in Kombination mit Rails 3.1 eingesetzt werden kann.

 

Downloads in verschiedenen Formaten:

source code
mp4
m4v
webm
ogv

 

Resourcen:

[javascript]
CreditCard =
cleanNumber: (number) -> number.replace /[- ]/g, ""

validNumber: (number) ->
total = 0
number = @cleanNumber(number)
for i in [(number.length-1)..0]
n = +number[i]
if (i+number.length) % 2 == 0
n = if n*2 > 9 then n*2 – 9 else n*2
total += n
total % 10 == 0

jQuery ->
$("#order_credit_card_number").blur ->
if CreditCard.validNumber(@value)
$("#credit_card_number_error").text("")
else
$("#credit_card_number_error").text("Invalid credit card number.")
[/javascript]

Rails 3.1 Release Candidate veröffentlicht

Wie auf der Rails-Konferenz 2011 versprochen, hat David gestern den ersten Release Candidate für Rails 3.1 veröffentlicht. neben Verbesserungen und Geschwindigkeitsoptimierungen bringt dieses Release viele Neuerungen mit.

Die größten Neuerungen sind

  • Die Asset Pipeline, welche auf Basis von Sprockets 2.0 statische Dateien wie JavaScripte und CSS performanter ausliefert. Zusätzlich sind SCSS als für Stylesheets und CoffeeScript für JavaScript als Default eingeführt worden.
  • HTTP Streaming (siehe Screencast) für eine schnellere Content-Auslieferung
  • JQuery löst nun Prototype als Standardbibliothek ab

 

Weiteres Features in diesem Release sind:

Eine vollständige und ausführlichere Liste zu den Änderungen sind im Changelog verfügbar: https://gist.github.com/958283

Die Installation kann wie gewohnt über gems durchgeführt werden:

[bash]
gem install rails –pre
[/bash]