Screencast: Queue Classic

Nachdem letzte Woche PostgreSQL allgemein vorgestellt wurde, geht es diese Woche weiter mit weiteren Features für die PostgreSQL benutzt werden kann. Neben der normal Datenbank-Funktionalität kann PostgreSQL auch als Queue für die Prozess-Verarbeitung eingesetzt werden. Somit wäre es nicht nötig noch eine zusätzliche Komponente für Hintergrundprozesse zu installieren und zu verwalten. Ryan zeigt diese Woche wie dies alles mit queue_classic gelöst werden kann.

 

Downloads in verschiedenen Formaten:

mp4
m4v
webm
ogg

 

Resourcen:

config/application.rb

[ruby]
# Although not shown in the episode, it is a good idea to uncomment this line in config/application.rb
# This is because the schema we are generating here cannot be represented in Ruby.
config.active_record.schema_format = :sql
[/ruby]

terminal

[bash]
rails g migration add_queue_classic
rails g migration setup_queue_classic
rake db:migrate
rake qc:work
rails c
[/bash]

rails console

[ruby]
QC.enqueue "puts", "hello world"
QC.enqueue "puts", msg: "hello world"
QC.enqueue "puts", "msg" => "hello world"
[/ruby]

Gemfile

[ruby]
gem ‚queue_classic‘, ‚2.0.0rc12‘
[/ruby]

lib/tasks/queue_classic.rake

[ruby]
require "queue_classic"
require "queue_classic/tasks"
[/ruby]

config/initializers/queue_classic.rb

[ruby]
ENV["DATABASE_URL"] = "postgres://localhost/mailer_development"
[/ruby]

migrations/*add_queue_classic.rb

[ruby]
def up
create_table :queue_classic_jobs do |t|
t.string :q_name
t.string :method
t.text :args
t.timestamp :locked_at
end
add_index :queue_classic_jobs, :id
end

def down
drop_table :queue_classic_jobs
end
[/ruby]

migrations/*setup_queue_classic.rb

[ruby]
def up
QC::Queries.load_functions
end

def down
QC::Queries.drop_functions
end
[/ruby]

newsletters_controller.rb

[ruby]
QC.enqueue "Newsletter.deliver", params[:id]
[/ruby]

models/newsletter.rb

[ruby]
def self.deliver(id)
newsletter = find(id)
# raise "Oops"
sleep 10 # simulate long newsletter delivery
newsletter.update_attribute(:delivered_at, Time.zone.now)
end
[/ruby]

Screencast: Migration nach PostgreSQL

PostgreSQL ist eine objekt-orientierte open source Datenbank. Sie ist zwar nicht so weit verbreitet wie MySQL stellt jedoch eine interessante Alternative im Enterprise-Bereich. Ryan zeigt in diesem Screencast wie er von SQLite nach PostgreSQL wechselt und welche Dinge man dabei beachten muss.

 

Downloads in verschiedenen Formaten:

mp4
m4v
webm
ogg

 

Resourcen:

terminal

[bash]
psql –version
brew install postgresql
initdb /usr/local/var/postgres
pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start
which psql
rails new blog -d postgresql
rake db:create:all
rails g scaffold article name content:text
rake db:migrate
psql blog_development
rails db
gem install taps
taps
taps server sqlite://db/development.sqlite3 rbates secret
taps pull postgres://rbates@localhost/store_development http://rbates:secret@localhost:5000
[/bash]

rails db

[ruby]
select * from articles;
d
d articles
?
h
h select
q
[/ruby]

config/database.yml

[text]
development:
adapter: postgresql
encoding: unicode
database: blog_development
pool: 5
username: rbates
password:

test:
adapter: postgresql
encoding: unicode
database: blog_test
pool: 5
username: rbates
password:
[/text]

Gemfile

[ruby]
gem "pg"
[/ruby]

Screencast: DataTables

DataTables erleichtert die Erstellung von Tabellen in HTML und unterstützt dabei seitenweise Navigation, Sortierung und Suchen. Ryan zeigt in diesem Screencast wie es in Rails eingesetzt werden kann.

 

Downloads in verschiedenen Formaten:

mp4
m4v
webm
ogg

 

Resourcen:

Gemfile

[ruby]
group :assets do
gem ‚jquery-datatables-rails‘, github: ‚rweng/jquery-datatables-rails‘
gem ‚jquery-ui-rails‘
end

gem ‚will_paginate‘
[/ruby]

app/assets/javascripts/application.js

[javascript]
//= require dataTables/jquery.dataTables
[/javascript]

app/assets/stylesheets/application.css

[css]
/*
*= require jquery.ui.core
*= require jquery.ui.theme
*= require dataTables/src/demo_table_jui
*/
[/css]

app/assets/javascripts/products.js.coffee

[javascript]
jQuery ->
$(‚#products‘).dataTable
sPaginationType: "full_numbers"
bJQueryUI: true
bProcessing: true
bServerSide: true
sAjaxSource: $(‚#products‘).data(’source‘)
[/javascript]

views/products/index.html.erb

[html]
<table id="products" class="display" data-source="<%= products_url(format: "json") %>">
<thead>
<tr>
<th>Product Name</th>
<th>Category</th>
<th>Release Date</th>
<th>Price</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
[/html]

products_controller.rb

[ruby]
def index
respond_to do |format|
format.html
format.json { render json: ProductsDatatable.new(view_context) }
end
end
[/ruby]

app/datatables/products_datatable.rb

[ruby]
class ProductsDatatable
delegate :params, :h, :link_to, :number_to_currency, to: :@view

def initialize(view)
@view = view
end

def as_json(options = {})
{
sEcho: params[:sEcho].to_i,
iTotalRecords: Product.count,
iTotalDisplayRecords: products.total_entries,
aaData: data
}
end

private

def data
products.map do |product|
[
link_to(product.name, product),
h(product.category),
h(product.released_on.strftime("%B %e, %Y")),
number_to_currency(product.price)
]
end
end

def products
@products ||= fetch_products
end

def fetch_products
products = Product.order("#{sort_column} #{sort_direction}")
products = products.page(page).per_page(per_page)
if params[:sSearch].present?
products = products.where("name like :search or category like :search", search: "%#{params[:sSearch]}%")
end
products
end

def page
params[:iDisplayStart].to_i/per_page + 1
end

def per_page
params[:iDisplayLength].to_i > 0 ? params[:iDisplayLength].to_i : 10
end

def sort_column
columns = %w[name category released_on price]
columns[params[:iSortCol_0].to_i]
end

def sort_direction
params[:sSortDir_0] == "desc" ? "desc" : "asc"
end
end
[/ruby]

Screencast: Globalize3

Rails bringt bereits standardmäßig die Möglichkeit mit eine mehrsprachige Applikation zu bauen. Dazu werden Textbausteine in Yaml-Dateien erstellt und in der Applikation verwendet. Dies reicht in den meisten Fällen aus, aber ist nur bedingt geeignet um große und dynamisch erstellte Textmengen zu verwalten. Hier hat Globalize3 seine Stärken. Globalize3 ist ein Gem mit welchem mehrsprachige Texte in Datenbanken verwaltet werden kann. Es ist relativ einfach einzubinden und zu verwenden . Ryan zeigt in diesem Screencast wie es funktioniert.

 

Downloads in verschiedenen Formaten:

mp4
m4v
webm
ogg

 

Resourcen:

Gemfile

[ruby]
gem ‚globalize3‘
[/ruby]

terminal

[bash]
rails g migration create_article_translations
rake db:migrate
rails c
[/bash]

rails console

[ruby]
I18n.locale
Article.first.name
I18n.locale = :wk
Article.first.update_attribute(:name, "Ahhyya")
I18n.locale = :en
[/ruby]

db/migrate/create_article_translations.rb

[ruby]
class CreateArticleTranslations < ActiveRecord::Migration
def up
Article.create_translation_table!({
name: :string,
content: :text
}, {
migrate_data: true
})
end

def down
Article.drop_translation_table! migrate_data: true
end
end
[/ruby]

models/article.rb

[ruby]
translates :name, :content
[/ruby]

config/application.rb

[ruby]
config.i18n.fallbacks = true
[/ruby]

Screencast: Copycopter

Copycopter ist eine Plugin um Texte in Rails auf einfache Weise zu bearbeiten. Erst kürzlich wurde es von Thoughtbot als OpenSource freigegeben und steht nun somit allen Interessierten zur Verfügung. Ryan zeigt diese Woche wie es installiert und in eigenen Applikationen benutzt werden kann.

 

Downloads in verschiedenen Formaten:

mp4
m4v
webm
ogg

 

Resourcen:

terminal

[bash]
heroku login
git clone git://github.com/copycopter/copycopter-server.git
cd copycopter-server
heroku create –stack cedar
bundle install –without=test # if heroku command fails
git push heroku master
heroku run rake db:migrate
heroku restart
heroku run rake copycopter:project NAME=Store USERNAME=ryanb PASSWORD=secret
heroku open
[/bash]

Gemfile

[ruby]
gem ‚copycopter_client‘, ‚2.0.0‘
[/ruby]

config/initializers/copycopter.rb

[ruby]
CopycopterClient.configure do |config|
config.api_key = ‚8df4bc164dd6bc5574eb1efd0499ddcb‘
config.host = ’strong-dawn-1901.herokuapp.com‘
end
[/ruby]

app/views/products/index.html.erb

[html]
<h1><%= t "products.headline", default: "Browse Products" %></h1>
<em><%= t ".tagline", default: "We have what you need at a great low price." %></em>
[/html]