Screencast: Rails für mobile Geräte

Der mobile Markt wächst stetig weiter und hat andere Anforderungen an Webapplikationen auf dem mobilen Gerät als für Desktop-Geräte. Ryan zeigt in seinem Screencast wie Rails angepasst werden kann um mobile Geräte zu unterstützen. Dabei kommt mitunter jQTouch zum Einsatz.

 

Download:

Download (55.4 MB, 13:26)
alternative download for iPod & Apple TV (22.4 MB, 13:26)

 

Resourcen:

Quellcode:

[ruby]
# config/initializers/mime_types.rb
Mime::Type.register_alias "text/html", :mobile

# application_controller.rb
before_filter :prepare_for_mobile

private

def mobile_device?
if session[:mobile_param]
session[:mobile_param] == "1"
else
request.user_agent =~ /Mobile|webOS/
end
end
helper_method :mobile_device?

def prepare_for_mobile
session[:mobile_param] = params[:mobile] if params[:mobile]
request.format = :mobile if mobile_device?
end
[/ruby]

[html]
<!– views/layouts/application.html.erb –>
<%= stylesheet_link_tag ‚mobile‘ if mobile_device? %>

<p>
<% if mobile_device? %>
<%= link_to "Full Site", :mobile => 0 %>
<% else %>
<%= link_to "Mobile Site", :mobile => 1 %>
<% end %>
</p>

<!– views/layouts/application.mobile.erb –>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title><%= h(yield(:title) || "Untitled") %></title>
<%= stylesheet_link_tag "/jqtouch/jqtouch.min.css", "/jqtouch/themes/apple/theme.min.css" %>
<%= javascript_include_tag "/jqtouch/jquery.1.3.2.min.js", "/jqtouch/jqtouch.min.js", "mobile" %>
<%= yield(:head) %>
</head>
<body>
<div class="current">
<%- if show_title? -%>
<div class="toolbar">
<%= link_to "Back", nil, :class => "back" unless current_page? root_path %>
<h1><%=h yield(:title) %></h1>
<%= link_to "Full Site", root_url(:mobile => 0), :class => "button", :rel => "external" %>
<%= yield(:toolbar) %>
</div>
<%- end -%>

<% unless flash.empty? %>
<div class="info">
<%- flash.each do |name, msg| -%>
<%= content_tag :div, msg, :id => "flash_#{name}" %>
<%- end -%>
</div>
<% end %>

<%= yield %>
</div>
</body>
</html>

<!– views/projects/index.mobile.erb –>
<% title "Projects" %>

<ul>
<% for project in @projects %>
<li class="arrow">
<%= link_to h(project.name), project %>
<small class="counter"><%= project.tasks.size %></small>
</li>
<% end %>
</ul>

<ul><li class="arrow"><%= link_to "New Project", new_project_path %></li></ul>
[/html]

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]

Betriebssystem herausfinden

Hin und wieder ist es erforderlich das Betriebssystem, auf dem die Applikation gerade ausgeführt wird, herauszufinden. Oft wird hierzu die „RUBY_PLATFORM“ dazu benutzt. Wie das folgende Beispiel zeigt, kann dies zu einem „falschen“ Ergenis führen.

RUBY_PLATFORM gibt z.B. bei der Verwendung von JRuby den Wert „java“ zurück. Das spiegelt nicht das Betriebssystem wieder, sondern die verwendete Engine unter der die Applikation läuft.

Ein Beispiel-Modul um das Betriebssystem herauszufinden wäre:

[ruby]
module Betriebssystem
def macintosh?
RUBY_PLATFORM.downcase.include?("darwin")
end

def windows?
RUBY_PLATFORM.downcase.include?("mswin")
end

def linux?
RUBY_PLATFORM.downcase.include?("linux")
end
end
[/ruby]

Um einen verlässlichen Wert zu bekommen, sollte man das Gem „sys-uname“ verwenden. Damit bekommt neben dem Betriebssystem auch viele weitere Informationen über die Umgebung heraus.

Installation von sys-uname:

[bash]
gem install sys-uname
[/bash]

Verwendung von sys-uname:

[ruby]
require ’sys/uname‘
include Sys

puts Uname.nodename
puts Uname.version
puts Uname.sysname
puts Uname.machine
puts Uname.release

p Uname.uname
[/ruby]

Auf diese Weise bekommt alle relevanten Daten die man ggf. benötigt.

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]

Screencast: Unbenutze CSS finden

Mit der zeit werden CSS Dateien größer und größer. Leider wird dabei auch viel nicht mehr benötigter Code mitgeschleppt. Ryan Bates zeigt in seinem Screencast wie man nicht mehr benötigten CSS findet.

Download:
Download (18.9 MB, 8:04)
Alternativer Download für iPod & Apple TV (10.8 MB, 8:04)


Weitere Resourcen:

Quellcode:

[bash]
sudo gem install aanand-deadweight
[/bash]

[ruby]
# lib/tasks/deadweight.rake
begin
require ‚deadweight‘
rescue LoadError
end

desc "run Deadweight CSS check (requires script/server)"
task :deadweight do
dw = Deadweight.new
dw.stylesheets = ["/stylesheets/application.css"]
dw.pages = ["/", "/feeds", "/about", "/episodes/archive", "/comments", "/episodes/1-caching-with-instance-variables"]
dw.ignore_selectors = /flash_notice|flash_error|errorExplanation|fieldWithErrors/
puts dw.run
end
[/ruby]

Open-Source Rails-Plugin von Vodafone

Das Ruby on Rails auch in großen Firmen eingesetzt wird, ist vielen bekannt.
Es ist gut zu sehen, dass viele nicht nur Open-Source in Ihren Projekten einsetzen, sondern auch Arbeit zurück in die Community fließen lassen.

Heute möchten wir euch ein Projekt vorstellen, das von Vodafone als Open-Source-Produkt der Community zur Verfügung gestellt wurde.

Das Plugin das wir euch vorstellen möchten heißt Dynamime.
Dynamime wurde im Rahmen eines Projekts entwickelt, bei dem unterschiedliche mobile Browser erkannt werden mussten, um dementsprechend das richtige Tempalte auszuwählen.

Die Browser-Erkennung bestehender Rails-Plugins war zum Projekt-Start nicht ausreichend, um die Anforderungen abzudecken.
Daher hatte man sich entschlossen es selber zu entwickeln und die Erfahrungen aus dem mobilen Umfeld einfliessen zu lassen.

Dynamime wurde inspiriert von mobile_fu. Im Gegensatz zu dem Rails-View-Ansatz auf dem auch z.B. mobile_fu basiert, benötigte man eine hierarchische Template-Auswahl.
D.h: Wenn ein Benutzer mit einem Nokia N95 auf die Webseite zugreift, sollte die Reihenfolge für die Template-Auswahl folgendermaßen aussehen:

Nokia N95-Template –> Wenn vorhanden dieses Benutzen –> wenn nicht vorhanden nach Nokia Series60-Template suchen –> Wenn vorhanden nehmen, ansonsten nach einem Generic-Nokia-Template suchen –> Wenn vorhanden nehmen, ansonsten Generic-XHTML… u.s.w.

Unter http://github.com/wvk/dynamime/tree/master findet ihr eine ausführliche Installations-Anleitung und wie ihr das Plugin in euren Rails-Projekten einsetzen könnt.

Wie hoffen, dass sich mehr Firmen diesem Beispiel anschließen 🙂

Viel Spaß mit dem Plugin

Euer RubyOnRails.de-Team

Comparing rails geo-plugins

Es gibt einige Plugins und Bibliotheken für Rails-Applikationen. Leider erschließt sich einem nicht auf Anhieb der Funktionsumfang der jeweiligen Projekte.

Auf jystewart.net findet ihr eine Sammlung von Geo-Plugins in einer Tabelle zusammengefasst.

Dort kann man sich vor Entwicklungsbeginn zumindest einen Überblick verschaffen.