マニュアル: Ruby on Rails

投稿日: 更新日:

Ruby on Railsチュートリアルをやって気づいたこと


  • サーバを起動するのは rails server
    • 他では hugo serve のように server でなく serve を使うことがおおい。
  • コンソールを起動: rails console
    • rails console --sandbox でDBへの書き込みを行わない(ロールバック)
  • Gemfileのバージョン指定
    • >= 1.3.0: 1.3.0以上
    • ~> 4.0.0: 4.0.0以上、4.1以下
    • ただしバージョンはガッチリ固定した方が良いことが多い。
  • Cloud9
    • Cloud9で起動する場合はPreview → Preview Running Application で出る小ウィンドウの右上のボタンを押して別ウィンドウで開く。
  • ルーティング: config/routes.rb
    • ルート: root application#hello
  • Git
    • git checkout -b ブランチ名 でブランチを作成しつつ切り替え
  • Heroku
    • /usr/local/heroku/bin 以下にインストールされる。
    • ログ: heroku logs
  • Scaffold
    • 登録、編集画面などを一括作成
    • rails generate scaffold User name:string email:string
      • リソース名(User)は単数形を使う。
    • config/routes.rbには resources :users のように設定
  • モデル
    • 検証: validates
      • length: 長さ(maximum)
      • presence: 存在
      • format: 書式
      • uniqueness: 一意性
        • case_sensitive: 大文字小文字を区別するかどうか
    • 関連付け
      • 1:n → has_many / belongs_to
    • 更新
      • save: 妥当性チェックがされる
        • これを避ける場合は update_attribute を使う
    • その他
      • before_save: save前に変換
  • データベース
    • run rails db:migrate
      • 疑問: データベースの列のサイズはどうなる?
      • PostgreSQLでは character varying となる(制限なし)
    • find(1) は存在しないときに例外を出す。 find_by(id: 1)ならnil。
  • コントローラ
    • render: 他のアクションのViewを呼び出す。例: 登録失敗時に再度入力フォームを出す
    • debugger: ここに来た時点でデバッガを出す(byebug)
  • ビュー
    • provide でページ固有変数定義
  • テスト
    • コントローラのテストも容易。
    • RED/GREEN表示には minitest-reportersを使う(3.6.1参照)
  • ヘルパー
    • いわゆるユーティリティクラス
  • スタイルシート
  • セキュリティ
    • has_secure_password
      • DB上のpassword_digestに保存
      • 属性 password, password_confirmationが追加
      • authenticateメソッドが追加
    • パラメータ
      • 以前はフォームの値をそのまま入れてたらしい(びっくり)
      • Strong Parametersという仕組みで、明示的に許可された属性だけ入れるようにする。

アプリを作って感じたこと

Railsで高速に開発するには以下のものが必要かなと感じました。

  • セキュリティ
    • チュートリアルでは自前で実装したが、自前で実装するのは避け、ライブラリか外部サービスを使う。
    • 外部サービスの例: Auth0
    • ライブラリの例: devise
  • セッション情報
    • チュートリアルではCookieに暗号化して全情報を入れている。
    • しかしこれは以下の問題がある。
      • Cookieのサイズ制限に引っかかる可能性がある
      • セッション再生攻撃をされる危険性がある。
    • 自分としてはまずactiverecord-session_storeでDBに保存して、アクセスが増えてきたらインメモリDBを使うのがいいと思う。
      • この場合の問題点はセッション情報が期限切れにならず残る可能性。
  • CSSフレームワーク
    • チュートリアルはBootstrapを使っている。
    • 個人的にはBulmaが好き。IE11対応が不要ならBulmaで良さそう。
  • コードが汚くなる問題
    • まずdraperを入れて、モデルからViewに関わる箇所を分離。
    • ヘルパーはユーティリティクラスと同じなのでなるべく避ける。
  • ビュー
    • ページネーションはチュートリアルはwill_paginateを使っているが、kaminariの方がスタンダードらしい(GitHubのスターも多い)
  • 認可
    • CanCanCan, Pundit, bankenのいずれかから選ぶ。
    • シンプルなものならチュートリアルでやったbefore_actionを使うのでもOK。
    • 認可系テストはしっかりやろう。「未ログイン」「ログイン済」「他のユーザでログイン済」の3パターン。あと「管理者」も。
  • エラー処理
    • 処理をまとめるには、 ActionController::ActionControllerError を継承した例外クラスを作って、raiseする。rescue_fromでリカバリーして、例外発生時の処理を行う。
  • テスト
    • モデルのValidationなど、宣言的にかける場所やっても効果が薄そう?
    • チュートリアルにもあったfakerは定番。
  • 監視

外部サイト

逆引きマニュアル