2月20日の技術勉強会

2月20日の技術勉強会

2月20日に行われました技術発表会の内容を撮影した動画ファイルを公開いたしました。内容は以下のとおりです。

テーマ Ruby on Rails
発表 d:id:secondlife
時間 46:38
ファイルサイズ 270,470,182Bytes

以下よりダウンロードしてご覧ください。

http://www.hatena.ne.jp/sound/tech/060220hatenatech.wmv (※現在はご覧いただけません。)

Rails って?

37SignalsのDHHが作ったRubyMVCフレームワーク

Rails の構成ライブラリ

ActionPack

enviroment で環境の切り分け
  • test
  • development
  • production
DB接続周り

ActiveRecordオブジェクト接続したり

requireするライブラリ自動ロード
  • productionならロードしたら終わり、productionなら毎回ロードしたいのはrequire_dependency
  • サーバ自動再起動が必要ない
Filter
  • before
  • after

簡単にフィルタをかけれる。またFilterオブジェクトを渡すことも可能

plugin

プラグイン拡張が楽

Layout

外枠templateの共有が楽

Routes
params

CGIのqueryみたいなもの

request

リクエストオブジェクト

@request.env['HTTP_USER_AGENT']
@request.post?
response

レスポンスオブジェクト

@response.body = 'foobar'
@response.header['content-type'] = 'text/html'
header['content-type'] # text/html
render

templateにレンダリングさせる処理。通常透過的に呼ばれる。

render :text => 'texttest', :layout => 'false'
render :template => '/foo/bar/baz'
render :nothing => 'true'

ActionPack

controllerとviewの結びつけ

いちばんべんり

controllerのインスタンス変数view(デフォルトerb)に渡す。じわじわととても便利。

# controller 
def index
  @foo = 'foostr'
end

#view
<%= @foo %>
template周り

デフォルトhelperいろいろ

その他もろもろ

自作helper

使い周しできそうな処理の外部分離

# helper
module HatenaHelper
  def usericon(name)
    usericon_prefix(name) + ".gif"
  end

  def usericon_small(name)
    usericon_prefix(name) + "_s.gif"
  end

  def usericon_prefix(name)
    "http://www.hatena.ne.jp/users/#{name[0, 2]}/#{name}/profile"
  end

# view
<%= usericon('secondlife') %>

ActiveRecord

ActiveRecordパターンのO/Rマッパ。拡張しまくってるので一般的に云われるActiveRecordパターンなのはコアの部分だけ。

DBIxっぽい?

シンプル
User.find 1234
User.find_by_name 'secondlife'
User.find_by_sql('select * from users where name = ?', ['secondlife'])
User.find(:all,:condition => ['name like "?", 'second*'], :limit => 50)

Usef.find([1..50]).each do |user|
  user.money += 100
  user.money_add_flag = true
  user.save
end
validate
class User < ActiveRecord::Base
  validates_length_of :first_name, :maximum => 10
  validates_inclusion_of :age, :in=>0..99
user = User.new :name => 'aaaaaaaaaaaaaaaaaaaaaaaa'
user.valid?
user.save
observer
  • (-) save
  • (-) valid?
  • (1) before_validation
  • (2) before_validation_on_create
  • (-) validate
  • (-) validate_on_create
  • (4) after_validation
  • (5) after_validation_on_create
  • (6) before_save
  • (7) before_create
  • (-) create
  • (8) after_create
  • (9) after_save
class User < ActiveRecord::Base
~snip
def before_save
  self.passwd = Digest::SHA1.hexdigest(self.passwd)
end

def after_save
  logger.info "#{self.id} complete"

もちろんObserverオブジェクトの登録も

ActionWebService

WebServiceを簡単に作れるよ。

ActionMailer

メールを簡単に送れるよ。日本語問題(UTF-8で送る)がデフォルトだと発生するよ。

Railsの強み

  • Berryz工房
    • Atok2006で「べりーずこうぼう」で変換できた!

Railsの弱み

  • 運用実績
    • 遅い?安定しない?
  • fcgiまわりよくわかんない
    • はまったとき・・・
    • メモリ管理周り
  • lighttpd
    • こまい設定手探り