Rails 3.1.0 has been released!

Riding Rails: Rails 3.1.0 has been released!


rails guidesに3.1.0 release notesが出ていますが、とりあえずアナウンスをご紹介。

Rails3.1.0ハイライト

ActionPack

・new asset pipelinenew asset pipeline
まだちゃんと読んでませんが、sprocketsの機能を使って
jsやcssをまとめたりminify(圧縮)したりして帯域を圧縮してくれるっぽい。


・Streaming response
これがいまいちよくわからん。
ActionController::Streaming
を見ると、遅延評価で表示速度を上げるっぽいのかな。
Unicorn with Nginx だそうです。


・RJSがgemに

ActiveModel

・attr_accessible系 にasオプションが利用可
rollを渡せるらしい。


・SecurePasswordメソッドが追加
BCryptとsaltでpasswordを暗号化してくれるっぽい。


ActiveRecord

・Prepared statement cacheを統合
insertとcreate時のprepared statmentのキャッシュを統合したっぽい。


・Associationsはrefactoredしてsimpleかつメンテナンスしやすくなったらしい


・default_scope
blockやlambdaやオブジェクトを渡して呼べるらしい(遅延評価)


PostgreSQLは8.2以上


・Migrationはinstance methodを使用するようになった。
class methodじゃなくinstance methodを使うようになった。
self.up から up メソッド。


・Migration 可逆に。
down書かなくてOK。見た目すっきり。
明示的にもかける。


・add_indexが自動で
外部参照列に対してindexが張られるようになったっぽい。
(これは、自動でやって欲しかった機能の一つ)


ActiveResource

・defult JSONへ。XMLも指定は可能。


ActiveSupport

・BufferedLogger
binaryへ。textmodeもportable newlines(なんやこれ、普通の改行のこと?)の出力時には使ってる。
これは、どうなんやろうか。


・Object#in? が追加
オブジェクトが他のオブジェクトに含まれているかどうか


・Dependencies::ClassCache
再読み込み可能な参照を保持できるクラス。(どういうこっちゃ。Identity Mapのこと?)


・weeks_ago and pref_week がDate/DateTime/Timeに追加


・JSON
decodeは1.8系の場合はyamlバックエンドを除いたOkJson、1.9系はdefultのが使われているらしい。
(よくわからん)


Railities

・schema.rbはutf-8
・Rack::Sendfileミドルウェア x_sendfile_headerが存在する場合使える
・rがrails runnerのaliasとして利用可
JQueryがデフォルト
・config.force_ssl でRack::SSLミドルェアを使ってhttpsに変更できるとか

Rails3.1 RC/Rails 3.0.8.rc1

Riding Rails: Rails 3.1: Release candidate

Riding Rails: Rails 3.0.8.rc1


rails3周りが活気づいてきた感があります。
aaron氏の3.0.8.rc1のアナウンスには、
rcリリース後、通常72時間でfinal versionがリリースされるとのこと。
今週末は祝日なので、5/31らしい。




以下、3.1 rcについて。

The Asset Pipeline

RailsConfのkeynoteまだ見てないけど、SCSSとCoffeeScriptの話。

HTTP Streaming

Riding Rails: Why HTTP Streaming?
Rails 3.1 でサポートされるHTTPストリーミング機能について - おもしろWEBサービス開発日記
http://d.hatena.ne.jp/willnet/20110418/1303145797
動的コンテンツを生成しながら、静的コンテンツをstreamingで取得できるらしい。


nginx x unicornは可能らしい。
やっぱこの組み合わせはpopularなのか。

jQuery is now the default

そのまま。

Other good stuff

Reversible migrations

Rails 3.1 の migration の変更点について - おもしろWEBサービス開発日記
書き方がDRYになったってやつですね。

Mountable engines

Mountable engines - RSoC Wrap Up
よくわからんが、rack のマウントが簡単に書けたり、
1個以上のルーティングが出来たりするとかなんかな。

Identity Map

Active Record’s query cache

斜め読みすると、
同じ検索を2回すると
Active Record’s query cacheにオブジェクトが2個できちゃうらしく
これが同一のものになると。
デフォルトoff。

Prepared statements

YouTube - RailsConf 2011: Aaron Patterson, "Double Dream Hands: So Intense!"
PostgreSQLは爆速。MySQLは複雑なSQLのみ早くなる。


動画では、下記のようなスライドが紹介されてました。
Simple(単純なSQL)、Complex(複雑なSQL)。
<SQLite3>
 Simple 8665 q/s ->12987 q/s
 Complex 339 q/s -> 4184 q/s
PostgreSQL
 Simple 4662 q/s -> 5586 q/s
 Complex 307 q/s -> 3322 q/s
MySQL
 Simple 6410 q/s -> 5154 q/s
 Complex 626 q/s -> 1198 q/s


関係ないけど、youtubeって時間指定できるのね。

Rack::Cache on by default

HTTP cache。page cacheの代わりになるらしい。
page cacheは、coreから外れてpluginになる予定。
apacheキャッシュでやってることができるんだろうか。

Turn test-output on Ruby 1.9

テスト結果が見やすいruby1.9用のgem。

Force SSL

force_sslでaplもしくはcontroller単位でssl設定が可能になる。
Rails3 で HTTPS を使うには - おもしろWEBサービス開発日記

Role-based mass-assignment protection

attr_protectedがroll単位で設定可能になる。
admin/non-adminみたいな感じで設定できるのか。

has_secure_password

Dead-simple BCrypt-based passwords.
よくわからんが、パスワード暗号化してくれるんか。

Custom serializers

Edge Rails.info :: Custom ActiveRecord Attribute Serialization
SerializeしたデータをAR経由で登録が可能になる。
配列は自動でYAMLになるらしい。
これは便利そう。


新apl作るなら、ruby1.9.2が超おすすめ。
Rails4までは、1.8系サポートするけどね。
ということらしいです。

20110527追記

Role-based mass-assignment protectionとhas_secure_passwordの解説です。
有り難い。
Rails 3.1: has_secure_passwordメソッド
has_secure_password

はじめる! Rails3(1) をやってみた

はじめる! Rails3(1) - 達人出版会


Rails3の基本機能を学ぶ題材としては、なかなか良いと感じました。
最終章に第2巻以降の詳細はまだ決まっていないと書かれていますが、続編にも期待。


Rails学ぶ上で誰しも通る道が、
1)scaffoldして感動
2)どういう仕組みになっているかを1つずつ解きほぐす
という作業があるかと思いますが
この2)についてRESTを意識しRailsアプリのチュートリアルとなっています。


また、この手のチュートリアルはついつい写経で終わってしまいがちですが
演習問題が用意されており、復習させてくれます。
Rails3から始めますって人には、お薦めです。


余談

Rails2から触っているので新たに学ぶことはあまり無かったのですが
link_toの書き方を下記のように書けるとはしりませんでした。(いつも hoge_pathみたいなんで書いてました)

<%= link_to "新規登録", [:new, :book] %>

Rails ERDを試してみた

Unexpected Run: Rails3.0でモデルのER図を簡単に出力する方法
こちらの記事を参考に、試してみました。


紹介記事の中にもありますが、railroadよりも簡単です。
railroadでクラス図作成 - うんたらかんたら日記


install

Rails ERD – Installation instructions

graphvizを入れます。
#brew
brew install cairo pango graphviz  

#port
sudo port install graphviz

#debian
sudo aptitude install graphviz
あとは

Gemfileに書いて、bundle installするだけ。

group :development do
  gem "rails-erd"
end

使い方

rake erd

コレだけ!!

オプション

Rails ERD – Customisation options


こんな感じでオプションを付けるとさらに見やすくなります。

rake erd attributes=foreign_keys,primary_keys,timestamps,inheritance,content


テーブル数が多い場合は、これなんかいいんじゃないでしょうか。

rake erd attributes=foreign_keys,primary_keys


デフォルトpdfですがgraphviz使ってるので画像も可です。

rake erd filetype=png

感想

とにかく簡単です。(graphviz周りのインストールだけです)
ざっとクラスの関係を見るにはいいんじゃないでしょうか。
primary_keyを上にしたいとか、関連の矢印を該当カラムの箇所にしたいとか
細かい要望はあるのですが。
graphvizのdotファイルに出力可能なので、そいつをGUIで編集できるツールがあると
本格的なER図作ったりするのに便利かもしれません。
(でもER図作るのはDBからできちゃうか)

続Rails3へのupdate(Ajax編)

Rails3.0.4へのupdate - うんたらかんたら日記の続き。



ATND Searchの移行時に
Ajaxではまりました(現在進行形ではまってる)よというお話です。

Rails3ではsubmit_to_remoteがない

rails2では、下記のようにsubmit_to_remoteを使用していました。
prototypeのAjax.Updaterを使う仕組みです。

      <%= submit_to_remote "submit", "Keyword Search",
                            :update => "body",
                            :url => {:action => :index},
                            :method => :post,
                            :with => "Form.serialize('condition')",
                            :loading => "Element.show('loading');",
                            :complete => "Element.hide('loading');" %>


生成されるhtmlは

<input name="submit" 
onclick="new Ajax.Updater('body', '/atnd_search/', {asynchronous:true, evalScripts:true, method:'post', onComplete:function(request){Element.hide('loading');}, onLoading:function(request){Element.show('loading');}, parameters:Form.serialize('condition') + '&amp;authenticity_token=' + encodeURIComponent('zn8ws55ANlGqD8nXdHkeSseGdjTpc8HTNgx7ExHi3U0=')});" type="button" value="Keyword Search">


しかし、rails3ではそのままでは動きません。

partial + replace_html

こちらがとても参考になりました。
Rails 3 では Ajax.Updater は使わない? - takihiroの日記


remoteオプションをtrueにし、書き換える箇所をpartial化。
rjsを作成しpage.replace_htmlで書き換えと。

<%= form_tag({:action => "index"}, :id => "condition", :remote => true) do %>

しかし

一応これで、ajaxでの動作は可能のだったんですが、
loading画像の表示ができません。
この部分です。

結局どうやったかというと

Rails3とjQueryを使ってAjaxのloadingとかcompleteを表示する方法 - 常識という迷信

こちらで紹介されているようにJQueryのliveを使うようにしました。


js.erb

$(function(){
   $("body")
    .live("ajax:beforeSend", function(){
      $("#loading_img").show();
    })
    .live("ajax:success", function(){
      $("span.count").text("検索件数:<%= @events_count %>件");
      $("div.ec-calendar").html("<%= escape_javascript(render :partial => 'calendar') %>");
    })
    .live("ajax:complete", function(){
      $("#loading_img").hide();
    });
});

でも

初回の検索でloading画像が見えません。
ん〜。


prototypeの場合はこちらを使うのがいいのかもしれません。
rails/prototype_legacy_helper - GitHub

Rail2.3からRail3.0への移行

WEB+DB PRESS vol.58 を参考にやってみました。
割と簡単にできたのですが、AJAXのとこで嵌りました。

対応したwebサービス

atnd_search

screenshot
ついでに、検索結果をcookieに保持するように修正しました。

toolbox_search

screenshot

やりかたざっくり

1.新規railsプロジェクト作成
2.application.rbの内容をenvironment.rbへ
3.routes.rb修正
4.database.yml修正
5.ソースを移行

1.新規railsプロジェクト作成
$ rails new toolbox_search -T -J
  • T はtest下のファイルを作成しません。RSpec使う人用です。
  • J はJQuery使う人用です。

必要なgemをGemfileに書いてbundle installします。

$ bundle install


ここらへんも。

rails g jquery:install
rails g rspec:install
2.application.rbの内容をenvironment.rbへ

Rails3では、environment.rbの内容をapplication.rbへ書くようになりました。
記載内容はほぼ同じです。


Logger.new する場合は log_pathがdeprecateらしいので下記のようにする必要があります。

#Rail2
config.logger = Logger.new(config.log_path)

#Rails3
config.logger = Logger.new(config.paths.log.first)
3.routes.rb修正

書き方はかなりすっきりしました。
こちらを参考にさせていただきました。
Rails 3のroutesまとめ

4.database.yml修正

mysqlを使う場合は、mysql2をGemfileに書いて、databaes.ymlのadapterを変更する必要があります。

development:
  adapter: mysql2
5.ソースを移行
cd rails3_project
cp -rpf path/to/rails2/app .
cp -rpf path/to/rails2/db .
cp -rpf path/to/rails2/lib .
cp -rpf path/to/rails2/public .
cp -rpf path/to/rails2/script .

ActiveRecordらへんは変更が必要ですが
だいたい、そのまま動きます。

その他

・viewの<%を<%=にしたり
・viewのhを削除したり
・named_scopeをscopeにしたり
・script/runnerをrails runnerにしたり
rubyも合わせて1.9にしたので、マジックコメント入れたり
Ajaxの変更で今回はまりました。が、疲れたので後で書きます。