Rails Recipes: Rails 3 Edition読書メモ
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できるとのこと。
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に。
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でも使えるのかな。つか、カヴァレッジツール、いろいろあるみたいだけど、どれがいいのかな。
@kentaro SimpleCov が鉄板です
— SHIBATA Hiroshi (@hsbt) June 2, 2012
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
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にしたのかよくわからなかったので、あとでまた見る。
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
独自ジェネレータを作成する。複雑で記憶できなかった。必要になったら見返す。