Screencast: ActiveAttr in eigenen Klassen verwenden

Die Entwickler von ActiveAttr sagen, dass ihr Plugin die Dinge zur Verfügung stellt, welche nicht von ActiveModel geliefert werden. Das Plugin bietet wirklich einige interessante Ansätze und erleichtert die Arbeit mit selbst-erstellen Modelen um einiges. Ryan zeigt in diesem Screencast wie es zum Beispiel in Modelen ohne zugehörige Datenbank-Tabelle eingesetzt werden kann.

 

Downloads in verschiedenen Formaten:

mp4
m4v
webm
ogg

 

Resourcen:

Gemfile

[ruby]
gem ‚active_attr‘
[/ruby]

models/message.rb

[ruby]
class Message
include ActiveAttr::Model

attribute :name
attribute :email
attribute :content
attribute :priority # type: Integer, default: 0

attr_accessible :name, :email, :content
validates_presence_of :name
validates_format_of :email, :with => /^[-a-z0-9_+.]+@([-a-z0-9]+.)+[a-z0-9]{2,4}$/i
validates_length_of :content, :maximum => 500
end
[/ruby]

rails console

[ruby]
m = Message.new(priority: 1)
m.priority
m.priority = 1
m.priority?
[/ruby]

controllers/messages_controller.rb

[ruby]
def new
@message = Message.new
end

def create
@message = Message.new(params[:message])
if @message.valid?
# TODO send message here
redirect_to root_url, notice: "Message sent! Thank you for contacting us."
else
render "new"
end
end
[/ruby]

Screencast: attr_accessible dynamisch setzen

Um Attribute eines Datenbank-Objekts zu schützen, kann in Rails auf attr_accessible zurückgegriffen werden. Damit wird verhindert, dass bei Mass Assingments bestimmte Attribute nicht verändert werden. Wenn der Zugriff/die Veränderung auf Basis von Zugriffsrechten erfolgen soll, muss attr_accessible dynamisch gesetzt werden. Wie dies funktioniert, zeigt Ryan in diesem Screencast

 

Download:

Download(16 MB, 9:12)
Alternativer Download für iPod & Apple TV(15 MB, 9:12)

 

Resourcen:

 

Quellcode:

[ruby]
# config/initializers/accessible_attributes.rb
class ActiveRecord::Base
attr_accessible
attr_accessor :accessible

private

def mass_assignment_authorizer
if accessible == :all
self.class.protected_attributes
else
super + (accessible || [])
end
end
end

# models/article.rb
class Article < ActiveRecord::Base
attr_accessible :name, :content
end

# articles_controller.rb
def create
@article = Article.new
@article.accessible = :all if admin?
@article.attributes = params[:article]
if @article.save
flash[:notice] = "Successfully created article."
redirect_to @article
else
render :action => ’new‘
end
end

def update
@article = Article.find(params[:id])
@article.accessible = :all if admin?
if @article.update_attributes(params[:article])
flash[:notice] = "Successfully updated article."
redirect_to @article
else
render :action => ‚edit‘
end
end
[/ruby]

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]