@kyanny's blog

My life. Opinions are my own.

閑話休題: 俺のかわいい depot が動かなくなった...

二週間ばかり停滞していたけど、今日の午後に二時間ほど時間が作れたので続きをやろうとしたら、 Rails 環境が動かなくなってしまっていた。

たぶん、 /usr/local 以下に入れた ruby1.8.7-p249 で動かしていたのに、それを消しちゃって MacPorts から入れた Ruby (バージョンはパッチレベルまで同じ、コンパイル時のオプションは多分結構違う)で動かそうとして、いろいろおかしくなってしまったようだ。

Rails のバージョンは 2.2.2 でどちらでも同じだったし RubyGems も同様だったような・・・?で、いろいろぐぐってみたけど、 NoMethodErro private method 'gsub!' みたいなエラーが延々出続ける。さらに悪いことに、ふつうに $ rails hoge して作ったまっさらなプロジェクトでもエラーが出て動かなかった。初回アクセス時はいいんだけど、リロードするとダメ。 webrick の escape メソッドあたりでコケていた。

rb-sqlite3 が入ってなかったので入れてみたりとか、しばらくやっていたけど、どうにもならなくて断念した。本で使ってるバージョンが Rails 2.2.2 だったからそれにあわせていたけど、いささか古すぎるということなのかもしれない。結局、二時間たっぷりハマって進展なしだった。

しかし、どう考えても種々のバージョンは全く同じだったはずなんだけど・・・なんで前までは動いていたのか、よくわからない。あの日々は幻だったのだろうか。軽々しくバージョン変えたりすると痛い目にあうのだなと、当たり前だけどいざ自分で経験してみて苦さが身にしみた一日だった。

そんなわけで、続きを再開できる目処がたっていない。けどまぁ、あとアプリケーションを動かす必要があるのは国際化とテストだけだし(でも本当はテストの章をがっつりやりたかった。。)、後ろのほうの章は結構読み進めたので、とりあえず今後も時間を作って最後まで読み通すことを目標にしよう。いつか環境を整えてリベンジしたい。当然そのときは最新版で。。

RailsによるアジャイルWebアプリケーション開発 第3版

RailsによるアジャイルWebアプリケーション開発 第3版

第11章 タスクF: ユーザ管理

管理画面と管理者ユーザの追加、アクセス制限などの実装。モデルの仮想属性、セッションによる認証、トランザクションとフックなど。

  • モデルの仮想属性
    • attr_accessor などで定義する
    • データベースのテーブルのカラムと関連付かないがモデルオブジェクトが保持しているデータ
  • Active Record の動的ファインダ => あとで
  • 同じアクション内で HTTP GET/POST による処理の振り分け request.post?
  • Rails のフィルタ機能
    • action の実行前後にフックをかけられる
  • Active Record のフックメソッド => これもあとで, モデルに対するフィルタみたいなもの

まとめが書けるのはここまで。12章以降はまた実践をしていこう。同時に、第二部も読み始めている。こちらは主に座学になるから、メモする内容も増えそう。またマインドマップを書いてみるのもいいかもしれない。

RailsによるアジャイルWebアプリケーション開発 第3版

RailsによるアジャイルWebアプリケーション開発 第3版

第10章 タスクE: チェックアウト!

注文する機能の実装。モデル間のリレーションが出てきた。 has_many, belongs_to など。

  • データベースの外部キー制約
    • データベースの種類に依存する (汎用性はない)
  • モデル間のリレーションシップ
  • モデルと連動したフォーム
    • 空のモデルオブジェクト (まだデータベース内の行と関連していない) をメモリ内に作ってフォームと関連づける
    • form_for ヘルパー
  • メモリ内に作られた order オブジェクトと、データベースに保存された order オブジェクトの違いを意識する
    • モデルオブジェクトには、データベースとのデータのやり取りだけではなく、通常のオブジェクトとしてビジネスデータを保持する役割もある

このへんから自由課題が難しくなってきたので飛ばしがちになった。

RailsによるアジャイルWebアプリケーション開発 第3版

RailsによるアジャイルWebアプリケーション開発 第3版

第9章 タスクD: Ajaxの追加

Ajax。部分テンプレート、 RJS など。 RJS はなんかむずかしそう。

  • 部分テンプレート
    • ビューの一部を専用のファイルにおさめたもの
    • ふつうは one action => one view template となる
  • 「一つのテンプレートにロジックが入りすぎていないか」
  • 部分テンプレート内ではテンプレートファイルと同じ名前のローカル変数にアクセスできる
    • このへんは実際にテンプレートを書きながら覚えるしか...
  • form_remote_tag リモートプロシージャコール
  • page 変数 JavaScript ジェネレータ
  • ヘルパーメソッドの作成
    • 処理をビューから切り離すして抽象化するときはヘルパーを作るべき
  • content_tag ヘルパー
  • JavaScript が無効の場合?
    • xhr? メソッド
  • Ajax 対応するときは、まず Ajax なしの場合で動くように作ってから Ajax 対応のコードを追加していくと良い
    • JavaScript 無効のときの実装も同時に作れる

RailsによるアジャイルWebアプリケーション開発 第3版

RailsによるアジャイルWebアプリケーション開発 第3版

第8章 タスクC: カートの作成

ショッピングカート機能を実装する。セッションを使う。フラッシュも。

  • セッション
    • ステートレスな HTTP プロトコルの上位でステートフルトランザクションの仕組みを擬似的に実現するもの
    • Rails では cookie ベースのものがデフォルト => 他のストレージを使う場合は設定変更が必要
  • session ハッシュに似てる、コントローラ内でアクセス可能
  • private メソッドは action として公開されない
  • params オブジェクトにリクエストパラメータが入っている
  • 「アプリケーションレベルのオブジェクトをセッションデータに格納するのは、一般には本当に最悪」
    • Product の例
    • オブジェクトそのものではなく、 primary key などの単純な数値、テキストなどを入れるべき
  • flash リクエストをまたがってアクセスできる一時的なデータ置き場、エラーメッセージなど
  • 共通のコードはメソッドとして抽出して重複をなくす

RailsによるアジャイルWebアプリケーション開発 第3版

RailsによるアジャイルWebアプリケーション開発 第3版