Kentaro Kuribayashi's blog

Software Engineering, Management, Books, and Daily Journal.

Rails Recipes: Rails 3 Edition読書メモ

f:id:antipop:20120603155521j:plain:w200:right

Rails Recipes: Rails 3 Editionをひと通りざっと読みました。以下、Twitterにメモってたのをまとめます。

Database Recipes

Create Meaningful Many-to-Many Relationships

同じhas_many :throughでの関連でも、条件が違うなら名前をつけて宣言的に書きましょう。

Create Declarative Named Queries

whereなどをだらだら書くより、scope使って宣言的に書く方がよいという話。何度も使うならそうした方がいいだろうけど、そうでないならメソッドにしておくぐらいでいいと思う。

Connect to Multiple Databases

複数データベースに接続する。AR::Baseを継承したクラスを作って、そいつの中でestablish_connectionして、その子クラスでmodelを作ればいい。しかし、database.ymlの中のDSLを名前で参照できるのはいいけど、RAILS_ENVの取り扱いはどうなるの……。

Set Default Criteria For Model Operations

default_scopeがcreate時にもデフォルト値を設定するの、ヤバい感じする。また、書かれてるように、ソースコード全体を見ないと変更されたデフォルト挙動がわからないので、メンテナンサビリティ下がるし、よくなさそう。

Add Behavior to Active Record Associations

associationにメソッド追加する方法。なるほど。使いそう。たとえば、レコード全部をmapしてなにかするとか、レコード全体をなにかにシリアライズするとか。

Create Polymorphic Associations

polymorphic arrociationって仰々しい名前だけど、単にid/typeの複合キーで、複数のモデルからのhas manyを実現できるという話。typeが非効率的で、使わなさそう

Version Your Models

act_as_versionedの話。ざっくり使う分には便利そうだけど、スケールしようとするとすぐ死にそう。

Perform Calculations on Your Model Data

averageとか簡単にだせるやつ。パフォーマンス大丈夫なのかな。

Use Active Record Outside of Rails

railsの外でAR使う話。AR::Base.establish_connectionで接続情報指定しとけばいい。

ORM別に悪くないでしょと思ってたけど、railsしか知らなかったら、確かに酷いクエリ投げまくりそうだと思った。

Connect to Legacy Databases

railsの規約にそわないtableの扱い方。wpを例に。AR::Baseでいろいろ返られる。pk名もそこで。これは、他言語で書かれたアプリをrailsに移植したりするときに必要になる場面ありそう。

Make Dumb Data Smart with composed_of()

compose_ofで、任意のオブジェクトにinflateできるとのこと。

DRY Up Your YAML Database Configuration File

merge keyでYAMLをDRYに。

Use Models Safely in Migrations

モデル名が変わってもちゃんとmigrateできるように、migrateの中でもクラス定義しておく。

Create Self-referential Many-to-Many Relationships

同じテーブル同士で多対多をしたい場合の方法。これは使いそう。トリガの使い方にも注意。

Protect Your Data From Accidental Mass-Update

mass-update vulnerabilityを防ぐ話。やりましょう。

Create a Custom Model Validator excerpt

カスタムヴァリデータを作る。each_validator以外のものを調べないと。

Nest has_many :through Relationships

二段階以上のhas_manyの方法。どんなクエリはいてるのかな。

Keep Your Application In Synch With Your Database Schema

既存のデータベースから、 db:schema:dumpでmigrationファイルを作成する。schema_migrationテーブルに情報ないので、generateしたファイルのタイムスタンプをつっこんでおくとつじつまがあう。使いそう。

Seed Your Database with Starting Data

db:seedで初期データ投入。create!にしないとエラってるの気づかなくて死ぬよ、との教え。

Use Helpers in Models

モデルにビューのヘルパーをincludeして使えるとかいってるけど、おいまじやめろ!!1

Avoid Dangling Database Dependencies

has_manyにはdependentオプションつけましょう。

Controller Recipes

Create Nested Resources

ネストしたresoucesの場合のビュー、コントローラの書き方。けっこう複雑。記憶できないので、必要になったら見返す。

Create a Custom Action in a REST Controller

resoursesにデフォルトのCRUD以外のアクションを追加する。memberでやればよい。これは使ったことある。

Create a Helper Method to Use In Both Controllers And Views

ヘルパーメソッドをviewとcontrollerのどっちでも使えるように。helper_methodマクロがある。しかし、helperの濫用は容易に破滅すると思う。

Trim Your REST Resources

resourcesによるルーティングで、only/exceptにより、不要なものを生成しないようにする。

Constrain Routes by Subdomain (and Other Conditions)

サブドメインをルーティングルールに追加したいときは、constraintにsubdomainを記述すればよい。知らんかった。

Add Web Services to Your Actions

respond_toを使って、クライアントのAcceptヘッダ/ルーティングのformatに応じたレスポンスを返す。scaffoldで生成するとこれ使われてるね。

Write Macros

マクロ(実際はコントローラのクラスメソッド)でアクションを動的生成してDRYに。

Manage a Static HTML Site with Rails

なんでもRails使わないと気が済まない病的なひとが、cache_page静的サイトを作る話。こわい。

Syndicate Your Site with RSS

XML Builderを使ってRSSフィードを作る話。

Set Your Application’s Home Page

rootでトップページ設定。sort_styleなんてオプションがあるのしらんかった。たとえば、同じアクションでも、トップページでは降順で、indexページでは昇順で、とかできるようだ。

User Interface Recipes

Create a Custom Form Builder

カスタムFormBuilderの作り方と、デフォルト設定する方法。

Pluralize Words on the Fly (or Not)

複数形とか定義してるのはinflectorで、そこで新たにいろいろ定義できるよ。

Insert Action-Specific Content in a Layout

layoutの中でアクション固有の表示パーツが必要な時は、content_forて作るとよい。viewがレンダリングされたあとにレイアウトがされる。

Add Unobtrusive Ajax with jQuery

jquery統合すごいなー。data-remoteでajaxする話。しかし、data-methodとかも暗黙感すごくて、便利だけど、怖い……。

Create One Form for Many Models excerpt

has_manyでネストされたフォームの生成。最初にこれ読んでたら苦労しなかったのに……。

Cache Local Data with HTML 5 Data Attributes excerpt

data属性のあつかいかた。content_tag_forのdataオプションで指定すればよい。デモとして、それをcoffescriptで読み出したり。

Testing Recipes

Automate Tests for Your Models

モデルのテスト。

Test Your Controllers

Test Your Helpers

読みとばし。

Test Your Outgoing Mailers

ActionMailerのテスト。つか、ActionMailerって、いまも使われてるのかな。resqueとかのジョブキューに外出しするいい感じの方法知りたいところ。

Testing Across Multiple Controllers

integration testの話。テスト関連、Test::Unitばかりなので読みとばし気味。

Focus Your Tests With Mocking and Stubbing

Mochaでstub/mockする。rspecのそれらとは何が違うんだろう。あとで見てみる。

Extract Test Fixtures from Live Data

DBに入ってるデータからfixtureデータを作る。使うかな、どうかな。

Create Dynamic Test Fixtures

DBに入ってるデータからfixtureデータを作る。使うかな、どうかな。

Measure and Improve Your Test Coverage

SimpleCovでカヴァレッジを取る。RSpecでも使えるのかな。つか、カヴァレッジツール、いろいろあるみたいだけど、どれがいいのかな。


Create Test Data With Factories

factory_girlでテストデータ生成する。associationで関連を、parentで継承みたいなのができる。

Email Recipes

Send Gracefully Degrading Rich-Content Emails

Send Email with Attachments

Test Incoming Email

Part5(ch48 - 50)はメール関連。とりあえずいまは興味ないので飛ばした。

Big-Picture Recipes

Roll Your Own Authentication

3.1から導入されたhas_secure_passwordを使ってauthenticationを作る。tutorialでもでてきたね。簡単便利。ライブラリ使うなら、deviseがいいよとのこと。そのへんなんかいっぱいあったと思うけど。

Protect Your Application With Basic HTTP Authentication

http_basic_authenticate_with / authenticate_or_request_with_http_basicでbasic認証する。後者はブロックわたせる。

Authorize Users with Roles

authorizationを実装する。ここでは自前で。これもいろいろライブラリがあるけど、どれがいいのかな。

Force Your Users to Access Site Functions with SSL

force_sslマクロでSSL強制。before_filterと同じく、only/except使える。

Create Secret URLs

秘密URLを作成する。特にRails関係ない感じの話。

Use Rails without a Database

DBなしでrailsアプリを書く方法。config/application.rbにrequire 'rails/all'と書かれてるのを消して、ほんとに必要なものだけ書くとか、test_helper.rbのfixtureのとこを消すとか。

id:r7kamura氏に、同様の話題を扱ったRails Modularity教えてもらった。

Create Your Own Ruby Gem

bundle gemでライブラリ作る話。スクリプト付きは-bオプション。

Use Bundler Groups to Manage per-Environment Dependencies

bundlerのgroupで、環境ごとにちゃんとグループ分けしましょう。トップレベルは:default

Package Rake Tasks for Reuse with a Gem

rakeのタスクをgem化して再利用可能にする。この説明ではどうやってgemにしたのかよくわからなかったので、あとでまた見る。

Explore Your Rails Application with the Console

rails cの話。デフォルトでappとhelperが定義されてるの知らなかった。

Automate Work with Your Own Rake Tasks

lib/tasks/*.rakeにrakeタスクを追加できる。:environmentが書かれてるのなんだろうと思ったのだけど、依存なのかー。rakeももっとみないとなー。紹介されていた以下の文書をちゃんと読もう。

Generate Documentation for Your Application

rake doc:*でドキュメント生成。

Render Application Data as Comma-Separated Values

CSV返す。

Debug and Explore Your Application with the ruby-debug Gem

ruby-debuggerでデバッグする。1.9の場合はruby-debugger19を使う。デバッガの中でirbを起動できる。pryはどうかな。

Render Complex Documents as PDFs

PDF出力。読み飛ばし。

Extending Rails

Support Additional Content Types with a Custom Renderer

icalを例に、カスタムレンダラ。mime_typs.rbの使い方がわかった。

Accept Additional Content Types with a Custom Parameter Parser

content parserを追加する。marshalをリクエストでぶっこんでもいい感じにするとかできて便利。

Templatize Your Generated Rails Applications

railsプロジェクトの、自分用雛形を作る。これ、継承的なことができたらかなりいい感じするなあ。やってるひといそう。

Automate Recurring Code Patterns with Custom Generators

独自ジェネレータを作成する。複雑で記憶できなかった。必要になったら見返す。

Create a Mountable Application as a Rails Engine Plug-In

mountableなengineを作る話。Engineの仕組みがよくわからないので、買ってあるCrafting Rails読まないとな。