Screencast: Datenexport nach Excel oder CSV

Für Datenexporte wird häufig CSV und/oder Excel eingesetzt. In Rails ist es relativ einfach diese Formate zur Verfügung zu stellen. Wie dies funktioniert, welche Optionen zur Verfügung stehen und wie ein Excel-Export in verschiedenen Formaten aussehen kann, zeigt Ryan in diesem Screencast.

 

Downloads in verschiedenen Formaten:

mp4
m4v
webm
ogg

 

Resourcen:

config/application.rb

[ruby]
require ‚csv‘
[/ruby]

products_controller.rb

[ruby]
def index
@products = Product.order(:name)
respond_to do |format|
format.html
format.csv { send_data @products.to_csv }
format.xls # { send_data @products.to_csv(col_sep: "t") }
end
end
[/ruby]

models/product.rb

[ruby]
def self.to_csv(options = {})
CSV.generate(options) do |csv|
csv << column_names
all.each do |product|
csv << product.attributes.values_at(*column_names)
end
end
end
[/ruby]

config/initializers/mime_types.rb

[ruby]
Mime::Type.register "application/xls", :xls
[/ruby]

views/products/index.xls.erb

[html]
<?xml version="1.0"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40">
<Worksheet ss:Name="Sheet1">
<Table>
<Row>
<Cell><Data ss:Type="String">ID</Data></Cell>
<Cell><Data ss:Type="String">Name</Data></Cell>
<Cell><Data ss:Type="String">Release Date</Data></Cell>
<Cell><Data ss:Type="String">Price</Data></Cell>
</Row>
<% @products.each do |product| %>
<Row>
<Cell><Data ss:Type="Number"><%= product.id %></Data></Cell>
<Cell><Data ss:Type="String"><%= product.name %></Data></Cell>
<Cell><Data ss:Type="String"><%= product.released_on %></Data></Cell>
<Cell><Data ss:Type="Number"><%= product.price %></Data></Cell>
</Row>
<% end %>
</Table>
</Worksheet>
</Workbook>
[/html]

Screencast: Authentifizierung über Facebook

In diesem Screencast zeigt Ryan wie eine neue Facebook erstellt und konfiguriert werden kann. Zusätzlich zeigt er wie das omniauth-facebook gem eingesetzt wird.

 

Downloads in verschiedenen Formaten:

mp4
m4v
webm
ogg

 

Resourcen:

Gemfile

[ruby]
gem ‚omniauth-facebook‘
[/ruby]

config/initializers/omniauth.rb

[ruby]
OmniAuth.config.logger = Rails.logger

Rails.application.config.middleware.use OmniAuth::Builder do
provider :facebook, ENV[‚FACEBOOK_APP_ID‘], ENV[‚FACEBOOK_SECRET‘]
end
[/ruby]

terminal

[bash]
rails g model user provider uid name oauth_token oauth_expires_at:datetime
rake db:migrate
[/bash]

models/user.rb

[ruby]
def self.from_omniauth(auth)
where(auth.slice(:provider, :uid)).first_or_initialize.tap do |user|
user.provider = auth.provider
user.uid = auth.uid
user.name = auth.info.name
user.oauth_token = auth.credentials.token
user.oauth_expires_at = Time.at(auth.credentials.expires_at)
user.save!
end
end
[/ruby]

config/routes.rb

[ruby]
match ‚auth/:provider/callback‘, to: ’sessions#create‘
match ‚auth/failure‘, to: redirect(‚/‘)
match ’signout‘, to: ’sessions#destroy‘, as: ’signout‘
[/ruby]

sessions_controller.rb

[ruby]
class SessionsController < ApplicationController
def create
user = User.from_omniauth(env["omniauth.auth"])
session[:user_id] = user.id
redirect_to root_url
end

def destroy
session[:user_id] = nil
redirect_to root_url
end
end
[/ruby]

application_controller.rb

[ruby]
private

def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
helper_method :current_user
[/ruby]

layouts/application.html.erb

[html]
<div id="user_nav">
<% if current_user %>
Signed in as <strong><%= current_user.name %></strong>!
<%= link_to "Sign out", signout_path, id: "sign_out" %>
<% else %>
<%= link_to "Sign in with Facebook", "/auth/facebook", id: "sign_in" %>
<% end %>
</div>
[/html]

app/assets/javascripts/facebook.js.coffee.erb

[javascript]

jQuery ->
$(‚body‘).prepend(‚<div id="fb-root"></div>‘)

$.ajax
url: "#{window.location.protocol}//connect.facebook.net/en_US/all.js"
dataType: ’script‘
cache: true

window.fbAsyncInit = ->
FB.init(appId: ‚<%= ENV["FACEBOOK_APP_ID"] %>‘, cookie: true)

$(‚#sign_in‘).click (e) ->
e.preventDefault()
FB.login (response) ->
window.location = ‚/auth/facebook/callback‘ if response.authResponse

$(‚#sign_out‘).click (e) ->
FB.getLoginStatus (response) ->
FB.logout() if response.authResponse
true
[/javascript]

Screencast: Brakeman

Brakeman ist ein Ruby-Gem mit dem der eigene Ruby-Code innerhalb einer Rails Applikation auf bekannte Sicherheitslücken geprüft werden kann. In diesem Screencast zeigt Ryan wie es eingesetzt werden kann.

 

Downloads in verschiedenen Formaten:

mp4
m4v
webm
ogg

 

Resourcen:

terminal

[bash]
gem install brakeman
rbenv rehash
brakeman
brakeman -o brakeman.html
bundle update rails
brakeman –rake
[/bash]

config/application.rb

[ruby]
config.active_record.whitelist_attributes = true
[/ruby]

products_controller.rb

[ruby]
def index
direction = params[:direction] == "desc" ? "desc" : "asc"
@products = Product.order("name #{direction}")
end
[/ruby]

sessions_controller.rb

[ruby]
redirect_to redirect_url, only_path: true
[/ruby]

models/user.rb

[ruby]
validates_format_of :name, with: /Aw+z/
[/ruby]

Gemfile

[ruby]
gem ‚brakeman‘, group: :development
[/ruby]

Screencast: Session Hijacking

Wenn nach einer Benutzer-Authentifizierung die zugehörigen Cookies über eine unsichere Verbindung ausgetauscht werden, kann dies das Ziel für Session-Hijacking-Angriffe werden. Was in einem solchen Fall getan werden muss und wie dies vermieden werden kann zeigt Ryan in diesem Screencast.

 

Downloads in verschiedenen Formaten:

mp4
m4v
webm
ogg

 

Resourcen:

terminal

[bash]
sudo tcpdump -i lo0 -A
curl http://todo.dev/
curl http://todo.dev/ -H ‚Cookies: …‘
curl https://todo.dev/ -k -H ‚Cookies: …‘
[/bash]

config/environments/production.rb

[ruby]
config.force_ssl = true
[/ruby]

sessions_controller.rb

[ruby]
cookies.signed[:secure_user_id] = {secure: true, value: "secure#{user.id}"}
# …
cookies.delete(:secure_user_id)
[/ruby]

application_controller.rb

[ruby]
def current_user
if !request.ssl? || cookies.signed[:secure_user_id] == "secure#{session[:user_id]}"
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
end
[/ruby]