Screencast: Tests mit Spork beschleunigen

Ab einer bestimmten Größe können die Testläufe die Entwicklung „verlangsamen“. Spork ist kann in diesem Fall Abhilfe schaffen, indem es die Ladezeiten verbessert. In Verbindung mit Guard bekommt man so schneller Rückmeldung über den aktuellen Stand. Ryan zeigt in diesem Screencast wie Spork eingesetzt werden kann.

 

Downloads in verschiedenen Formaten:

mp4
m4v
webm
ogg

 

Resourcen:

bash

[bash]
rspec .
time rspec .
bundle
spork –bootstrap
spork
rspec . –drb
guard init spork
[/bash]

Gemfile

[ruby]
group :test do
gem "spork", "> 0.9.0.rc"
gem "guard-spork"
end
[/ruby]

Guardfile

[ruby]
guard ’spork‘, :cucumber_env => { ‚RAILS_ENV‘ => ‚test‘ }, :rspec_env => { ‚RAILS_ENV‘ => ‚test‘ } do
watch(‚config/application.rb‘)
watch(‚config/environment.rb‘)
watch(%r{^config/environments/.+.rb$})
watch(%r{^config/initializers/.+.rb$})
watch(’spec/spec_helper.rb‘)
watch(%r{^spec/support/.+.rb$})
end

guard ‚rspec‘, :version => 2, :cli => "–drb", :all_on_start => false, :all_after_pass => false do
# …
end
[/ruby]

spec/spec_helper.rb

[ruby]
require ‚rubygems‘
require ’spork‘

Spork.prefork do
# …
RSpec.configure do |config|
# …
config.treat_symbols_as_metadata_keys_with_true_values = true
config.filter_run :focus => true
config.run_all_when_everything_filtered = true
end
end

Spork.each_run do
# This code will be run each time you run your specs.
FactoryGirl.reload
end
[/ruby]

Screencast: Administrationsfläche über Active Admin

Fast jede Applikation benötigt eine Administrationsfläche, mit der Werte angepasst und Texte verwaltet werden können. Active Admin bringt diese Möglichkeit der Verwaltung für Rails Applikationen mit und sieht obendrein auch nett aus. Ryan zeigt in diesem Screencast wie es installiert und benutzt wird.

 

Downloads in verschiedenen Formaten:

mp4
m4v
webm
ogg

 

Resourcen:

bash

[bash]
bundle rails g active_admin:install rake db:migrate rails g active_admin:resource product
[/bash]

Gemfile

[ruby]
gem ‚activeadmin‘
[/ruby]

app/admin/products.rb

[ruby]
ActiveAdmin.register Product do scope :unreleased index do column :name column :category column "Release Date", :released_at column :price, :sortable => :price do |product| div :class => "price" do number_to_currency product.price end end default_actions end end
[/ruby]

app/admin/dashboards.rb

[ruby]
ActiveAdmin::Dashboards.build do section "Recent Products" do table_for Product.order("released_at desc").limit(5) do column :name do |product| link_to product.name, [:admin, product] end column :released_at end strong { link_to "View All Products", admin_products_path } end end
[/ruby]

app/assets/stylesheets/application.css.scss

[css]
@import "products";
[/css]

config/initializers/active_admin.rb

[ruby]
config.site_title = "Ryan’s Store"
[/ruby]

Screencast: Authentifizierung mit sorcery

sorcery ist ein modular aufgebautes Authetifizierungs-System für Rails 3.0/3.1. In diesem Screencast zeigt Ryan wie es eingesetzt werden kann.

 

Downloads in verschiedenen Formaten:

mp4
mp4
webm
ogg

 

Resourcen:

bash

[bash]
bundle
rake sorcery:bootstrap
rails g sorcery_migration core remember_me
rails g model user –skip-migration
rake db:migrate
rails g controller users new
rails g controller sessions new
[/bash]

Gemfile

[ruby]
gem ’sorcery‘
[/ruby]

config/initializers/sorcery.rb

[ruby]
Rails.application.config.sorcery.submodules = [:remember_me]

# . . .

user.username_attribute_name = :email
[/ruby]

models/user.rb

[ruby]
class User < ActiveRecord::Base
authenticates_with_sorcery!

attr_accessible :email, :password, :password_confirmation

validates_confirmation_of :password
validates_presence_of :password, :on => :create
validates_presence_of :email
validates_uniqueness_of :email
end
[/ruby]

users_controller.rb

[ruby]
def new
@user = User.new
end

def create
@user = User.new(params[:user])
if @user.save
redirect_to root_url, :notice => "Signed up!"
else
render :new
end
end
[/ruby]

views/users/new.html.erb

[html]
<%= form_for @user do |f| %>
<% if @user.errors.any? %>
<div class="error_messages">
<h2>Form is invalid</h2>
<ul>
<% for message in @user.errors.full_messages %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :email %>
<%= f.text_field :email %>
</div>
<div class="field">
<%= f.label :password %>
<%= f.password_field :password %>
</div>
<div class="field">
<%= f.label :password_confirmation %>
<%= f.password_field :password_confirmation %>
</div>
<div class="actions"><%= f.submit %></div>
<% end %>
[/html]

sessions_controller.rb

[ruby]
def create
user = login(params[:email], params[:password], params[:remember_me])
if user
redirect_back_or_to root_url, :notice => "Logged in!"
else
flash.now.alert = "Email or password was invalid"
render :new
end
end

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

views/sessions/new.html.erb

[html]
<%= form_tag sessions_path do %>
<div class="field">
<%= label_tag :email %>
<%= text_field_tag :email, params[:email] %>
</div>
<div class="field">
<%= label_tag :password %>
<%= password_field_tag :password %>
</div>
<div class="field">
<%= check_box_tag :remember_me, 1, params[:remember_me] %>
<%= label_tag :remember_me %>
</div>
<div class="actions"><%= submit_tag "Log in" %></div>
<% end %>
[/html]

config/routes.rb

[ruby]
get "logout" => "sessions#destroy", :as => "logout"
get "login" => "sessions#new", :as => "login"
get "signup" => "users#new", :as => "signup"
resources :users
resources :sessions
[/ruby]

home_controller.rb

[ruby]
before_filter :require_login, :only => :secret
[/ruby]

application_controller.rb

[ruby]
def not_authenticated
redirect_to login_url, :alert => "First login to access this page."
end
[/ruby]

application.html.erb

[html]
<% if current_user %>
Logged in as <%= current_user.email %>.
<%= link_to "Log out", logout_path %>
<% else %>
<%= link_to "Sign up", signup_path %> or
<%= link_to "log in", login_path %>.
<% end %>
[/html]

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.