サーバを起動
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
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 を使う
- save: 妥当性チェックがされる
- その他
- before_save: save前に変換
データベース
run rails db:migrate
- 疑問: データベースの列のサイズはどうなる?
- PostgreSQLでは
character varying
となる(制限なし)
find(1)
は存在しないときに例外を出す。find_by(id: 1)
ならnil。
コントローラ
- render: 他のアクションのViewを呼び出す。例: 登録失敗時に再度入力フォームを出す
- debugger: ここに来た時点でデバッガを出す(byebug)
ビュー
provide
でページ固有変数定義link_to
: リンクを作成link_to パス パラメータ(Hash)
テスト
- コントローラのテストも容易。
- RED/GREEN表示には minitest-reportersを使う(3.6.1参照)
ヘルパー
- いわゆるユーティリティクラス
スタイルシート
- application.cssにかかれている
require_tree
はただのコメントではなく、アセットパイプライン。 - The Asset Pipeline — Ruby on Rails Guides
セキュリティ
has_secure_password
- DB上のpassword_digestに保存
- 属性 password, password_confirmationが追加
- authenticateメソッドが追加
- パラメータ
- 以前はフォームの値をそのまま入れてたらしい(びっくり)
- Strong Parametersという仕組みで、明示的に許可された属性だけ入れるようにする。
アプリを作って感じたこと
Railsで高速に開発するには以下のものが必要かなと感じました。
- セキュリティ
- セッション情報
- チュートリアルではCookieに暗号化して全情報を入れている。
- しかしこれは以下の問題がある。
- Cookieのサイズ制限に引っかかる可能性がある
- セッション再生攻撃をされる危険性がある。
- 自分としてはまずactiverecord-session_storeでDBに保存して、アクセスが増えてきたらインメモリDBを使うのがいいと思う。
- この場合の問題点はセッション情報が期限切れにならず残る可能性。
- CSSフレームワーク
- コードが汚くなる問題
- まずdraperを入れて、モデルからViewに関わる箇所を分離。
- ヘルパーはユーティリティクラスと同じなのでなるべく避ける。
- ビュー
- ページネーションはチュートリアルはwill_paginateを使っているが、kaminariの方がスタンダードらしい(GitHubのスターも多い)
- 認可
- CanCanCan, Pundit, bankenのいずれかから選ぶ。
- シンプルなものならチュートリアルでやったbefore_actionを使うのでもOK。
- 認可系テストはしっかりやろう。「未ログイン」「ログイン済」「他のユーザでログイン済」の3パターン。あと「管理者」も。
- エラー処理
- 処理をまとめるには、
ActionController::ActionControllerError
を継承した例外クラスを作って、raiseする。rescue_fromでリカバリーして、例外発生時の処理を行う。
- 処理をまとめるには、
- テスト
- モデルのValidationなど、宣言的にかける場所やっても効果が薄そう?
- チュートリアルにもあったfakerは定番。
- 監視
- メモリ: log-runtime-metricsをオンにする。