Rails in a Nutshell

Rails in a Nutshell vom OReilly Verlag ist momentan frei als Online-Version verfügbar. Die Nutshell-Reihe behandelt i.d.R. Themen in einem sehr kurzen und knappen Umfang und konzentriert sich auf das Wesentliche. Daher werden diese Bücher gerne als Nachschlagewerke benutzt.

Die Autoren von Rails in a Nutshell sind Cody Fauser, James MacAulay, Edward Ocampo-Gooding und John Guenin. Das Buch geht auf die verschiedensten Bereiche von Rails ein und viele werden es sicher begrüßen ein solch kompaktes Werk zur Hnd zu haben.

Die gedruckte Version wird voraussichtlich Anfang 2010 erscheinen und soll die kommende Rails-Version 3.0 abdecken.

Auf den Seitenvon OReilly könnt ihr euch selber ein Bild von dem Buch machen: http://rails-nutshell.labs.oreilly.com/

Viel Spaß bei der Lektüre.

Screencast: Formtastic Teil 2

In der letzten Woche hat Ryan Bates Formtastic vorgestellt. In seinem neuen Screencasts geht er tiefer in den Funktionaumfang ein und erklärt vorgeschrittene Themen wie: many-to-many Beziehungen, Pflichtfelder und der Gestaltung von Formularen.

Download (19.7 MB, 9:11)
Alternativer Download für iPod & Apple TV(12.6 MB, 9:11)

Resourcen:

Quellcode:

[bash]
script/generate nifty_scaffold problem name:string
rake db:migrate
script/generate nifty_scaffold symptom animal_id:integer problem_id:integer –skip-controller
script/plugin install git://github.com/redinger/validation_reflection.git
[/bash]

[ruby]
# models/animal.rb
class Animal < ActiveRecord::Base
attr_accessible :name, :category_id, :born_on, :female, :problem_ids
belongs_to :category
has_many :symptoms
has_many :problems, :through => :symptoms
validates_presence_of :name, :born_on
end

# models/problem.rb
class Problem < ActiveRecord::Base
attr_accessible :name
has_many :symptoms
has_many :animals, :through => :symptoms
end

# models/symptom.rb
class Symptom < ActiveRecord::Base
attr_accessible :animal_id, :problem_id
belongs_to :animial
belongs_to :problem
end

# config/initializers/formtastic_config.rb
Formtastic::SemanticFormBuilder.inline_errors = :none
[/ruby]

[javascript]
/* formtastic_changes.css */
form.formtastic fieldset ol li p.inline-hints {
font-style: italic;
font-size: 11px;
}
[/javascript]

[html]

<!– views/animals/_form.html.erb –>
<% semantic_form_for @animal do |f| %>
<%= f.error_messages %>
<% f.inputs do %>
<%= f.input :name, :hint => "Use the owner’s name if none is provided" %>
<%= f.input :born_on, :start_year => 1900 %>
<%= f.input :category, :include_blank => false %>
<%= f.input :female, :as => :radio, :label => "Gender", :collection => [["Male", false], ["Female", true]] %>
<%= f.input :problems, :as => :check_boxes, :required => false %>
<% end %>
<%= f.buttons %>
<% end %>
[/html]

7 Videos von der WindyCityRails 2009

All diejenigen die nicht bei der WindyCityRails-Konferenz in Chicago sein konnten, haben nun die Möglichkeit sich zumindest sieben Vorträge als Video anzuschauen.

Die Videos sind auf den Seiten von windycityrails.org zu finden:

Better Ruby through Functional Programming von Dean Wampler – Dean Wampler führt in seinem Vortrag in die Konzepte der Funktionalen Programmierung ein.

Super-easy PDF Generation with Prawn and Prawnto von John McCaffrey – John zeigt wie einfach PDF Generierung sein kann.

Comics Is Hard: On Domains and Databases von Ben Scofield – Alernativen zu SQL-getriebenen Applikationen.

UI Fundamentals for Programmers von Ryan Singer – Ryan zeigt Arbeitsweisen von 37Signals.

How To Test Absolutely Anything (in Rails) von Noel Rappin – Noel zeigt wie man alle Schichten einer Rails-Applikation testen kann.

Optimizing Perceived Performance von David Eisinger – David zeigt an einem Beispiel wie Rails und JQuery zusammenarbeiten.

Rails 3 Update von Yehuda Katz – Yehuda gibt einen Einblick in Rails 3 und was uns mit diesem Release erwartet.

Screencast: Formtastic Teil 1

Formtastic, ein Hilfmittel um die Arbeit mit Views zu vereinfachen, ist das heutige Thema in dem Screencst von Ryan Bates.

Download(19.7 MB, 10:41)
Alternativer Download für iPod & Apple TV (12.7 MB, 10:41)

Resourcen:

[bash]
rails vet
sudo rake gems:install
script/generate nifty_layout
script/generate nifty_scaffold category name:string description:text
rake db:migrate
script/generate formtastic_stylesheets
script/generate nifty_scaffold animal name:string category_id:integer born_on:date female:boolean
[/bash]

[html]
<!– application.html.erb –>
<%= stylesheet_link_tag ‚application‘, ‚formtastic‘, ‚formtastic_changes‘, :cache => "base" %>

<!– views/animals/_form.html.erb –>
<% semantic_form_for @category do |f| %>
<%= f.inputs %>
<%= f.buttons %>
<% end %>

<!– views/animals/_form.html.erb –>
<% semantic_form_for @animal do |f| %>
<% f.inputs do %>
<%= f.input :name %>
<%= f.input :born_on, :start_year => 1900 %>
<%= f.input :category, :include_blank => false %>
<%= f.input :female, :as => :radio, :label => "Gender", :collection => [["Male", false], ["Female", true]] %>
<% end %>
<%= f.buttons %>
<% end %>
[/html]

Screencast: Gemcutter & Jeweler

Neue Woche, neuer Screencast. In dieser Woche zeigt Ryan wie man Gemcutter, ein Service für Gem-Hosting, und Jewelery, Ein Tool zur Verwaltung von Gems, einsetzt.

Download(18.8 MB, 7:24)
Alternativer Download für iPod & Apple TV(10.5 MB, 7:24)

Ressourcen:

[bash]
sudo gem update –system
sudo gem install gemcutter
gem tumble
gem build uniquify.gemspec
gem push uniquify-0.1.0.gem
sudo gem install jeweler
rake –tasks
rake version:write
rake version:bump:minor
rake gemcutter:release
[/bash]

[ruby]
# Rakefile
begin
require ‚jeweler‘
Jeweler::Tasks.new do |gemspec|
gemspec.name = "uniquify"
gemspec.summary = "Generate a unique token with Active Record."
gemspec.description = "Generate a unique token with Active Record."
gemspec.email = "ryan@railscasts.com"
gemspec.homepage = "http://github.com/ryanb/uniquify"
gemspec.authors = ["Ryan Bates"]
end
Jeweler::GemcutterTasks.new
rescue LoadError
puts "Jeweler not available. Install it with: sudo gem install jeweler -s http://gemcutter.org"
end

# uniquify.gemspec
Gem::Specification.new do |s|
s.name = %q{uniquify}
s.version = "0.1.0"

s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
s.authors = ["Ryan Bates"]
s.date = %q{2008-11-09}
s.description = %q{Generate a unique token with Active Record.}
s.email = %q{ryan@railscasts.com}
s.extra_rdoc_files = ["lib/uniquify.rb", "README.rdoc"]
s.files = ["lib/uniquify.rb", "Rakefile", "README.rdoc", "Manifest", "uniquify.gemspec"]
s.has_rdoc = true
s.homepage = %q{http://github.com/ryanb/uniquify}
s.rdoc_options = ["–line-numbers", "–inline-source", "–title", "Uniquify", "–main", "README.rdoc"]
s.require_paths = ["lib"]
s.rubyforge_project = %q{uniquify}
s.rubygems_version = %q{1.2.0}
s.summary = %q{Generate a unique token with Active Record.}

if s.respond_to? :specification_version then
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
s.specification_version = 2

if current_version >= 3 then
else
end
else
end
end
[/ruby]

Screencast: Bilder ausschneiden

In seinem heutigen Screencast zeigt Ryan Bates wie man mit Jcrop und Paperclip eine Applikation bauen kann, mit der Benutzern die Möglichkeit gegeben werden kann Bilder zu beschneiden.

Download:
Download(46.3 MB, 14:07)
Alternativer Download für iPod & Apple TV (22.4 MB, 14:07)

Resourcen:

Quellcode:

[ruby]

# models/user.rb
class User < ActiveRecord::Base
has_attached_file :avatar, :styles => { :small => "100×100#", :large => "500×500>" }, :processors => [:cropper]
attr_accessor :crop_x, :crop_y, :crop_w, :crop_h
after_update :reprocess_avatar, :if => :cropping?

def cropping?
!crop_x.blank? && !crop_y.blank? && !crop_w.blank? && !crop_h.blank?
end

def avatar_geometry(style = :original)
@geometry ||= {}
@geometry[style] ||= Paperclip::Geometry.from_file(avatar.path(style))
end

private

def reprocess_avatar
avatar.reprocess!
end
end

# users_controller.rb
def create
@user = User.new(params[:user])
if @user.save
if params[:user][:avatar].blank?
flash[:notice] = "Successfully created user."
redirect_to @user
else
render :action => "crop"
end
else
render :action => ’new‘
end
end

def update
@user = User.find(params[:id])
if @user.update_attributes(params[:user])
if params[:user][:avatar].blank?
flash[:notice] = "Successfully updated user."
redirect_to @user
else
render :action => "crop"
end
else
render :action => ‚edit‘
end
end

# lib/paperclip_processors/cropper.rb
module Paperclip
class Cropper < Thumbnail
def transformation_command
if crop_command
crop_command + super.sub(/ -crop S+/, “)
else
super
end
end

def crop_command
target = @attachment.instance
if target.cropping?
" -crop ‚#{target.crop_w.to_i}x#{target.crop_h.to_i}+#{target.crop_x.to_i}+#{target.crop_y.to_i}’"
end
end
end
end
[/ruby]

[html]
<!– views/users/crop.html.erb –>
<% title "Crop avatar" %>
<% content_for(:head) do %>
<%= stylesheet_link_tag "jquery.Jcrop" %>
<%= javascript_include_tag "jquery.Jcrop.min" %>
<script type="text/javascript" charset="utf-8">
$(function() {
$(‚#cropbox‘).Jcrop({
onChange: update_crop,
onSelect: update_crop,
setSelect: [0, 0, 500, 500],
aspectRatio: 1
});
});

function update_crop(coords) {
var rx = 100/coords.w;
var ry = 100/coords.h;
$(‚#preview‘).css({
width: Math.round(rx * <%= @user.avatar_geometry(:large).width %>) + ‚px‘,
height: Math.round(ry * <%= @user.avatar_geometry(:large).height %>) + ‚px‘,
marginLeft: ‚-‚ + Math.round(rx * coords.x) + ‚px‘,
marginTop: ‚-‚ + Math.round(ry * coords.y) + ‚px‘
});
var ratio = <%= @user.avatar_geometry(:original).width %> / <%= @user.avatar_geometry(:large).width %>;
$("#crop_x").val(Math.round(coords.x * ratio));
$("#crop_y").val(Math.round(coords.y * ratio));
$("#crop_w").val(Math.round(coords.w * ratio));
$("#crop_h").val(Math.round(coords.h * ratio));
}
</script>
<% end %>

<%= image_tag @user.avatar.url(:large), :id => "cropbox" %>

<h4>Preview:</h4>
<div style="width:100px; height:100px; overflow:hidden">
<%= image_tag @user.avatar.url(:large), :id => "preview" %>
</div>

<% form_for @user do |f| %>
<% for attribute in [:crop_x, :crop_y, :crop_w, :crop_h] %>
<%= f.hidden_field attribute, :id => attribute %>
<% end %>
<p><%= f.submit "Crop" %></p>
<% end %>
[/html]

RubyMine Beta 2 veröffentlicht

Die Firma Jetbrains, vielen bekannt von der IDE IntelliJ-IDEA, hat Ihre Ruby-IDE RubyMine in einer neuen Verison 2 als Beta veröffentlicht.

Die IDE unterstützt viellerlei Funktionen, die die Entwicklung von Rails und Ruby-Applikationen vereinfacht/unterstützt. Den vollen Funktionsumfang incl. der Preise sind auf der Produktseite zu finden: http://www.jetbrains.com/ruby/index.html