ASCIIcasts

Die Screencasts von Ryan Bates, die wir euch jede Woche vorstellen, sind sehr beliegt. Eifion Bedford ist genauso begeistert von den Screencasts und hat einen großen Teil des Portfolios von railscasts.com in eine „Plain-Version“ umgewandelt. D.h. er hat die Videos in eine ASCII Version umgewandelt, damit diese einfacher zu durchsuchen sind.

Nachdem er mit den ersten Screencasts angefangen hatte, ist ihm klar geworden, dass die Community eher an den neueren Videos interessiert ist. Daher gibt es einen Versionssprung in der Liste der verfügbaren Ascii-Casts und es sind auch noch nicht alle Videos „konvertiert“ worden.

Dies ist die Liste der verfügbaren Ascii-Casts:

Screencast: MongoDB und MongoMapper

MongoDB ist eine dokumenten-orientierte Datenbank. In dieser Woche zeigt Ryan wie MongoMapper benutzt werden kann, um auf MongoDB zuzugreifen.

Download

Download (24.1 MB, 13:13)
Alternativer download für iPod & Apple TV (15.3 MB, 13:13)

 

Resourcen:

Quellcode:

[bash]
rails todo
sudo rake gems:install
script/generate nifty_layout
script/generate nifty_scaffold project name:string –skip-migration
script/generate nifty_scaffold task project_id:string name:string completed:boolean –skip-migration
[/bash]

[ruby]
# config/environment.rb
config.gem "mongo_mapper"

# config/initializers/mongo_config.rb
MongoMapper.database = "todo-#{Rails.env}"

# models/project.rb
class Project
include MongoMapper::Document

key :name, String, :required => true
key :priority, Integer

many :tasks
end

# models/task.rb
class Task
include MongoMapper::Document

key :project_id, ObjectId
key :name, String
key :completed, Boolean

belongs_to :project
end

# script/console
Project.all
Project.all(:order => "name")
Project.all(:priority => 3)
Project.all(:priority.gte => 2)
Project.all(:priority.in => [2, 3])
[/ruby]

[html]
<!– projects/_form.html.erb –>
<p>
<%= f.label :priority %><br />
<%= f.select :priority, [1,2,3,4,5] %>
</p>

<!– tasks/_form.html.erb –>
<p>
<%= f.label :project_id %><br />
<%= f.collection_select :project_id, Project.all, :id, :name %>
</p>
[/html]

Screencast: Model ohne DB-Tabelle

Ein Model muss nicht zwingend eine Datenbank Tabelle referenzieren. Um dies umzusetzen müssen lediglich ein paar Methoden angelegt werden. Welche das sind zeigt Ryan Bates in seinem dieswöchigen Screencast.

Download:
Download (14.8 MB, 8:28)
Alternativer Download für iPod & Apple TV (10.4 MB, 8:28)

Resourcen:

Quellcode:

[bash]
script/generate nifty_scaffold recommendation from_email:string to_email:string article_id:integer message:text new create
rake db:migrate
rake db:rollback
rm db/migrate/*_recommendations.rb
[/bash]

[ruby]
# models/recommendation.rb
class Recommendation < ActiveRecord::Base
def self.columns() @columns ||= []; end

def self.column(name, sql_type = nil, default = nil, null = true)
columns << ActiveRecord::ConnectionAdapters::Column.new(name.to_s, default, sql_type.to_s, null)
end

column :from_email, :string
column :to_email, :string
column :article_id, :integer
column :message, :text

validates_format_of :from_email, :to_email, :with => /^[-a-z0-9_+.]+@([-a-z0-9]+.)+[a-z0-9]{2,4}$/i
validates_length_of :message, :maximum => 500

belongs_to :article
end

# recommendations_controller.rb
def new
@recommendation = Recommendation.new(:article_id => params[:article_id])
end

def create
@recommendation = Recommendation.new(params[:recommendation])
if @recommendation.valid?
# send email
flash[:notice] = "Successfully created recommendation."
redirect_to root_url
else
render :action => ’new‘
end
end
[/ruby]

Screencast: Authorisierung mit CanCan

Authorisierung in Webapplikation lassen sich auf einfache Art und Weise mit CanCan realisieren. Ryan Bates zeigt in diesem Screencast wie dieses Plugin eingesetzt werden kann.

 

Download (30.2 MB, 15:57)
Alternativer Download für iPod & Apple TV (20.3 MB, 15:57)

 

Resourcen:

Quellcode:

[bash]
sudo rake gems:install
[/bash]

[ruby]
# config/environment.rb
config.gem "cancan"

# models/ability.rb
class Ability
include CanCan::Ability

def initialize(user)
user ||= User.new # guest user

if user.role? :admin
can :manage, :all
else
can :read, :all
can :create, Comment
can :update, Comment do |comment|
comment.try(:user) == user || user.role?(:moderator)
end
if user.role?(:author)
can :create, Article
can :update, Article do |article|
article.try(:user) == user
end
end
end
end
end

# application_controller.rb
rescue_from CanCan::AccessDenied do |exception|
flash[:error] = "Access denied."
redirect_to root_url
end

# articles_controller.rb
load_and_authorize_resource

# comments_controller.rb possibility
load_and_authorize_resource :nested => :article
[/ruby]

[html]
<!– articles/show.html.erb –>
<p>
<% if can? :update, @article %>
<%= link_to "Edit", edit_article_path(@article) %> |
<% end %>
<% if can? :destroy, @article %>
<%= link_to "Destroy", @article, :method => :delete, :confirm => "Are you sure?" %> |
<% end %>
<%= link_to "Back to Articles", articles_path %>
</p>

<p>
<% if can? :update, comment %>
<%= link_to "Edit", edit_comment_path(comment) %>
<% end %>
<% if can? :destroy, comment %>
| <%= link_to "Destroy", comment, :method => :delete, :confirm => "Are you sure?" %>
<% end %>
</p>

<!– articles/index.html.erb –>
<% if can? :create, Article %>
<p><%= link_to "New Article", new_article_path %></p>
<% end %>
[/html]

MongoDB: Eine Einführung und Nutzung mit Ruby/Rails

MongoDB ist eine dokumenten-orientierte Datenbank, die als OpenSource-software zur Verfügung steht. Wir haben euch drei Screencasts rausgesucht, in denen ihr diese Datenbank näher kennenlernen und sehen wie ihr es mit Ruby und Rails benutzen könnt.

Die Screencasts stammen von Yoon You und sind auf techmecode.com auch als Downloadversion erhältlich.

Die Download-Versionen sind unter folgenden Links zu finden:


Introduction to MongoDB – Part I

Download(36MB, 13:09)
Alternativer Download für iPod & iPhone (17MB, 13:09)



Introduction to MongoDB – Part II

Download(52.5MB, 20:20)
Alternativer Download für iPod & iPhone (22.3MB, 20:20)



Introduction to MongoDB – Part III, MongoMapper & Rails

Download(21.8MB, 09:29)
Alternativer Download für iPod & iPhone (9.5MB, 09:29)

Screencast: Mechanize

Mechanize ist eine Library mit der Webseiten automatisch abgesurft werden können. Es unterstützt Weiterleitungen, Cookies und mehr. Ryan zeigt diese Woche wie Mechanize benutzt werden kann.

Download (22.8 MB, 10:16)
Alternativer Download für iPod & Apple TV (14.8 MB, 10:16)

Resourcen:

Quellcode:
[bash]
sudo gem install mechanize
[/bash]

[ruby]
# script/console
puts Readline::HISTORY.entries.split("exit").last[0..-2].join("n")

# lib/tasks/product_prices.rake
desc "Import wish list"
task :import_list => :environment do
require ‚mechanize‘
agent = WWW::Mechanize.new

agent.get("http://railscasts.tadalist.com/session/new")
form = agent.page.forms.first
form.password = "secret"
form.submit

agent.page.link_with(:text => "Wish List").click
agent.page.search(".edit_item").each do |item|
Product.create!(:name => item.text.strip)
end
end
[/ruby]

Screencast: Einen Twitter Clone erstellen

Twitter ist so gut wie jedem ein Begriff und viele verwenden es bereits täglich. Eric Berry hat auf teachmecode.com eine Serie von Screencasts veröffentlicht, in dem er zeigt wie man einen Twitter Clone erstellen kann.

Die Serie besteht aus sechs Teilen und ist frei auf dem Video-Portal vimeo (www.vimeo.com) erhältlich.

Damit ihr euch die Videos nicht „mühsam“ zusammensuchen müsst, haben wir euch hier alle sechs Teile zusammengepackt.

Viel Spaß bei den Videos.

Screencast: Screen Scraping mit Nokogiri

Screen Scraping, ein Verfahren um ganze oder Teile von Webseiten auszulesen, wird gerne für Mashups eingesetzt. Ryan Bates zeigt in seinem dieswöchigen Screencast, wie dies mit Nokogiri umgesetzt werden kann.

Download (43 MB, 13:34)
Alternativer Download für iPod & Apple TV (21.9 MB, 13:34)

Ressourcen:

Quellcode:

[bash]
sudo gem install nokogiri — –with-xml2-include=/usr/local/include/libxml2 –with-xml2-lib=/usr/local/lib
[/bash]

[ruby]
# nokogiri_test.rb
require ‚rubygems‘
require ’nokogiri‘
require ‚open-uri‘

url = "http://www.walmart.com/search/search-ng.do?search_constraint=0&ic=48_0&search_query=batman&Find.x=0&Find.y=0&Find=Find"
doc = Nokogiri::HTML(open(url))
puts doc.at_css("title").text
doc.css(".item").each do |item|
title = item.at_css(".prodLink").text
price = item.at_css(".PriceCompare .BodyS, .PriceXLBold").text[/$[0-9.]+/]
puts "#{title} – #{price}"
puts item.at_css(".prodLink")[:href]
end

# lib/tasks/product_prices.rake
desc "Fetch product prices"
task :fetch_prices => :environment do
require ’nokogiri‘
require ‚open-uri‘

Product.find_all_by_price(nil).each do |product|
url = "http://www.walmart.com/search/search-ng.do?search_constraint=0&ic=48_0&search_query=#{CGI.escape(product.name)}&Find.x=0&Find.y=0&Find=Find"
doc = Nokogiri::HTML(open(url))
price = doc.at_css(".PriceCompare .BodyS, .PriceXLBold").text[/[0-9.]+/]
product.update_attribute(:price, price)
end
end
[/ruby]

Screencast: Embedded Association

Diese Woche zeigt Ryan Bates in seinem Screencast wie selbstreferenzierende DB-Beziehungen (one-to-many, many-to-many) umgesetzt werden können.

Download (18.7 MB, 14:03)
Alternativer Download für iPod & Apple TV (15.4 MB, 14:03)

Ressourcen:

Quellcode:

One to many:

[bash]
script/generate migration add_role_to_users role:string
rake db:migrate
[/bash]

[ruby]
# models/user.rb
class User < ActiveRecord::Base
acts_as_authentic
has_many :articles
has_many :comments

ROLES = %w[admin moderator author]

def role_symbols
[role.to_sym]
end
end
[/ruby]

[ror]
<!– users/new.html.erb –>
<p>
<%= f.label :role %><br />
<%= f.collection_select :role, User::ROLES, :to_s, :titleize %>
</p>
[/ror]

Many to many

[bash]
script/generate migration add_roles_mask_to_users roles_mask:integer
rake db:migrate
[/bash]

[ruby]
# models/user.rb
class User < ActiveRecord::Base
acts_as_authentic
has_many :articles
has_many :comments

named_scope :with_role, lambda { |role| {:conditions => "roles_mask & #{2**ROLES.index(role.to_s)} > 0"} }

ROLES = %w[admin moderator author]

def roles=(roles)
self.roles_mask = (roles & ROLES).map { |r| 2**ROLES.index(r) }.sum
end

def roles
ROLES.reject { |r| ((roles_mask || 0) & 2**ROLES.index(r)).zero? }
end

def role_symbols
roles.map(&:to_sym)
end
end
[/ruby]

[ror]
<!– users/new.html.erb –>
<p>
<%= f.label :roles %><br />
<% for role in User::ROLES %>
<%= check_box_tag "user[roles][]", role, @user.roles.include?(role) %>
<%=h role.humanize %><br />
<% end %>
<%= hidden_field_tag "user[roles][]", "" %>
</p>
[/ror]

Screencast: Declarative Authorization

Benutzer-Authorisierung wird in vielen, wenn nicht sogar in den meisten, Applikationen benötigt. Wie dies umgesetzt werden kann zeigt Ryan in seinem dieswöchigen Screencast.

Dowload:
Download (36.4 MB, 15:27)
Alternative download für iPod & Apple TV (21.6 MB, 15:27)


Resourcen:

Quellcode:

[bash]
sudo rake gems:install
[/bash]

[ruby]
# config/environment.rb
config.gem "declarative_authorization", :source => "http://gemcutter.org"

# config/authorization_rules.rb
authorization do
role :admin do
has_permission_on [:articles, :comments], :to => [:index, :show, :new, :create, :edit, :update, :destroy]
end

role :guest do
has_permission_on :articles, :to => [:index, :show]
has_permission_on :comments, :to => [:new, :create]
has_permission_on :comments, :to => [:edit, :update] do
if_attribute :user => is { user }
end
end

role :moderator do
includes :guest
has_permission_on :comments, :to => [:edit, :update]
end

role :author do
includes :guest
has_permission_on :articles, :to => [:new, :create]
has_permission_on :articles, :to => [:edit, :update] do
if_attribute :user => is { user }
end
end
end

# application_controller.rb
before_filter { |c| Authorization.current_user = c.current_user }

protected

def permission_denied
flash[:error] = "Sorry, you are not allowed to access that page."
redirect_to root_url
end

# articles_controller.rb
filter_resource_access
[/ruby]

[html]
<!– articles/show.html.erb –>
<p>
<% if permitted_to? :edit, @article %>
<%= link_to "Edit", edit_article_path(@article) %> |
<% end %>
<% if permitted_to? :destroy, @article %>
<%= link_to "Destroy", @article, :method => :delete, :confirm => "Are you sure?" %> |
<% end %>
<%= link_to "Back to Articles", articles_path %>
</p>

<p>
<% if permitted_to? :edit, comment %>
<%= link_to "Edit", edit_comment_path(comment) %>
<% end %>
<% if permitted_to? :destroy, comment %>
| <%= link_to "Destroy", comment, :method => :delete, :confirm => "Are you sure?" %>
<% end %>
</p>

<!– articles/index.html.erb –>
<% if permitted_to? :create, Article.new %>
<p><%= link_to "New Article", new_article_path %></p>
<% end %>
[/html]