Screencast: JSON Dokumente mit Jbuilder erstellen

Jbuilder (nicht zu verwechseln mit der Java IDE der Firma CodeGear, früher Borland) ist ein Gem zum Erstellen von JSON Dokumenten. Hierzu stellt Jbuilder eine DSL und Template Engines zur Verfügung, mit der auch komplexe Rückgabe-Dokumente erstellt werden können. Ryan zeigt in dieser Woche wie es installiert, integriert und verwendet wird.

 

Downloads in verschiedenen Formaten:

mp4
mp4
webm
ogg

 

Resourcen:

Gemfile

[ruby]
gem ‚jbuilder‘
[/ruby]

views/articles/show.json.builder

[ruby]
json.(@article, :id, :name, :published_at)
json.edit_url edit_article_url(@article) if current_user.admin?

json.author @article.author, :id, :name
# or
json.author do |json|
json.(@article.author, :id, :name)
json.url author_url(@article.author)
end

json.comments @article.comments, :id, :name, :content
# or
json.comments @article.comments do |json, comment|
json.partial! comment
end
[/ruby]

views/comments/_comment.json.jbuilder

[ruby]
json.(comment, :id, :name, :content)
[/ruby]

Rails 3.2.1 veröffentlicht

Nur kurz nach dem letzten Release (26. Januar 2012) folgt heute ein weiteres Update. Es sind nur kleiner Veränderungen eingeflossen.

Zu den Veränderungen gehören:

Action Pack:

  • Verbesserung Dokumentation
  • ‚form.select‘ akzeptiert ranges
  • Anpassungen an ‚datetime_select‘

 

Active Record:

  • Die Schwelle für Auto-EXPLAIN wird ignoriert when kein logger vorhanden ist
  • ‚to_s‘ wurde angepasst
  • Mögliche race condition wir abgefangen, wenn zwei Threads gleichzeitig auf das selbe Attribut in der gleichen Klasse zugreifen/verändern möchten.
Active Support:
  • Documentation ergänzt
  • Aktualisierung der Zeitzonen-Information
  • die veraltete Methode ‚ActiveSupport::Base64.decode64‘ ruft nun ‚::Base64.decode64‘ auf
  • Die Konstante ‚ActiveSupport::TaggedLogging::ERROR‘ wird nun richtig initialisiert
Railties:
  • Verbesserung Dokumentation
  • Bei der Generierung von Migrationen werden nun auch weitere Dezimalwerte/Schreibweisen akzeptiert: decimal{1.2}, decimal{1-2}

 

Die Releasenotes sind auch Github verfügbar:

https://gist.github.com/1685812

Screencast: Upgrade auf Rails 3.2

Letzte Woche erschien Rails 3.2 und bringt, wie wir schon berichtet haben, ein paar neue Features mit. Wie diese verwendet werden und wie ein Upgrade durchgeführt werden kann, zeigt Ryan in dieser Woche in seinem Screencast.

 

Downloads in verschiedenen Formaten:

mp4
m4v
webm
ogg

 

Resourcen:

Gemfile

[ruby]
gem ‚rails‘, ‚3.2.0‘
group :assets do
gem ’sass-rails‘, " ~> 3.2.3"
gem ‚coffee-rails‘, "~> 3.2.1"
gem ‚uglifier‘, ‚>= 1.0.3‘
end
[/ruby]

terminal

[bash]
bundle update
rails g model product_variation product_id:integer:index name ‚price:decimal{7,2}‘
rails g migration add_properties_to_product_variations properties:text
rake db:migrate
echo -d postgresql -T > ~/.railsrc
[/bash]

rails console

[ruby]
puts Product.order(:name).explain
ActiveRecord::Base.silence_auto_explain { Product.order(:name) }
Product.pluck(:name)
Product.pluck(:id)
Product.select(:name).uniq
Product.where(name: "Foo").first_or_create!
Product.where(name: "Foo").first_or_create!(price: 5)
"Product".safe_constantize
p = ProductVariation.new(color: ‚blue‘, size: 3)
p.color
p.size
p.properties[:color]
[/ruby]

config/development.rb

[ruby]
# Raise exception on mass assignment protection for Active Record models
config.active_record.mass_assignment_sanitizer = :strict

# Log the query plan for queries taking more than this (works
# with SQLite, MySQL, and PostgreSQL)
config.active_record.auto_explain_threshold_in_seconds = 0.5

config.log_tags = [:uuid, :remote_ip]
[/ruby]

config/test.rb

[ruby]
# Raise exception on mass assignment protection for Active Record models
config.active_record.mass_assignment_sanitizer = :strict
[/ruby]

models/product_variation.rb

[ruby]
store :properties, accessors: [:color, :size]
[/ruby]

Ruby on Rails 3.2

Bereits am 20. Januar hatte David die neue Rails-Version angekündigt. Ursprünglich für Dezember letzen Jahres geplant, ist am Wochenende Rails 3.2 veröffentlicht worden.

Wie in den vorherigen Version, ist bei diesem Release wieder Wert auf Geschwindigkeit gelegt worden. Allerdings diesmal auf die Geschwindigkeit während des Developments. In Rails 3.2 werden nun, wenn im Development Environment gestartet, nur die Klassen erneut geladen. So hat man gerade in großen Projekten eine spürbare Geschwindigkeitsverbesserung. Rails 3.2 ist das letzte Release, welches noch Ruby 1.8.x unterstützt. Beginnend mit Rails 4.0 wird Ruby 1.9.3 erforderlich sein.

Weitere Neuerungen sind:

  • Schnelleres Routing und URL-Generierung dur die neue Journey Engine
  • Explain Queries um einen besseren Einblick in die generierten SQL-Statements zu bekommen und ggf. zu prüfen ob die gesetzten Indexes verwendet werden.
  • Tagged Logger um Einträge/Benutzer in Logfiles filtern zu können
  • Active Record Store für die Verwendung von Key/Value Paaren ohne direkt die zugehörige Datenbank installieren zu müssen

Die gesamten Releasenotes inklusive einer Update-Anleitung ist wie auf folgender Seite verfügbar: http://guides.rubyonrails.org/3_2_release_notes.html

Screencast: Private Pub für Realtime-Events

Privat Pub ist ein Gem mit dem Echtzeit-Events auf sehr einfach Weise erstellt und genutzt werden können. In diesem Screencast erfahrt ihr wie es in Kombination mit Rails verwendet werden kann.

 

Downloads in verschiedenen Formaten:

mp4
mp4
webm
ogg

 

Resourcen:

Gemfile

[ruby]
gem ‚private_pub‘
[/ruby]

terminal

[bash]
bundle
rails g private_pub:install
rackup private_pub.ru -s thin -E production
[/bash]

messages/index.html.erb

[html]
<%= subscribe_to "/messages/new" %>
[/html]

messages/create.js.erb

[javascript]
<% publish_to "/messages/new" do %>
$("#chat").append("<%= j render(@message) %>");
<% end %>
[/javascript]

messages_controller.rb

[ruby]
PrivatePub.publish_to("/messages/new", message: @message)
[/ruby]

app/assets/javascripts/messages.js.coffee

[javascript]
PrivatePub.subscribe "/messages/new", (data, channel) ->
alert data.message.content
[/javascript]

Screencast: Pretty URLs mit FriendlyId

Benutzerfreundliche URLs erleichtert z.B. Besuchern sprechende Bookmarks zu erstellen oder Optimierungen bzgl. SEO durchzuführen. Das Plugin friendly_id erfüllt die Erstellung von Pretty URLs und bringt zusätzlich noch weitere Features mit. Ryan zeigt wie es installiert und eingesetzt werden kann.

 

Downloads in verschiedenen Formaten:

mp4
m4v
webm
ogg

 

Resourcen:

terminal

[bash]
rails g migration add_slug_to_articles slug:string
rake db:migrate
rails c
rails g friendly_id
[/bash]

rails console

[ruby]
Article.find_each(&:save)
[/ruby]

db/migrate/add_slug_to_articles.rb

[ruby]
add_column :articles, :slug, :string
add_index :articles, :slug
[/ruby]

models/article.rb

[ruby]
class Article < ActiveRecord::Base
extend FriendlyId
friendly_id :name, use: :slugged

def should_generate_new_friendly_id?
new_record?
end
end

# Or…

class Article < ActiveRecord::Base
extend FriendlyId
friendly_id :name, use: :history
end
[/ruby]

Screencast: HTML Emails mit Rails verschicken

Um Mails in HTML zu verschicken, bedarf es einiger Vorbereitung, da diese nicht wie Standard-Webseiten erstellt werden können. Die Unterschiede sind mannigfaltig, aber es gibt ein paar Helfer in Form von Gems, die diese Arbeit erleichtern. Ryan zeigt in diesem Screencast wie premailer-rails3 und roadie eingesetzt werden können.

 

Downloads in verschiedenen Formaten:

mp4
m4v
webm
ogg

 

Resourcen:

terminal

[bash]
rails new mailit
cd mailit
rails g mailer newsletter_mailer weekly
bundle
rails c
[/bash]

Gemfile

[ruby]
gem ‚roadie‘

# or

gem ‚hpricot‘
gem ‚premailer-rails3‘
[/ruby]

app/mailers/newsletter_mailer.rb

[ruby]
def weekly(email)
mail to: email, subject: "RailsCasts Weekly"
end
[/ruby]

config/environments/development.rb

[ruby]
config.action_mailer.default_url_options = { host: "railscasts.com" }
config.action_mailer.raise_delivery_errors = true
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
address: "smtp.gmail.com",
port: 587,
domain: "railscasts.com",
authentication: "plain",
enable_starttls_auto: true,
user_name: ENV["GMAIL_USERNAME"],
password: ENV["GMAIL_PASSWORD"]
}
[/ruby]

rails console

[ruby]
NewsletterMailer.weekly("foo@example.com").deliver
[/ruby]