Posted at

Rails チュートリアル メモ 第7章

More than 1 year has passed since last update.


メモ


7.1.1 環境


  • 以下の3つ


    • development

    • test

    • production



  • 指定方法


    • rails console : rails console production

    • rails server : rails server --environment production

    • マイグレーション : rails db:migrate RAILS_ENV=production




7.1.2 routes.rb における resources



  • resources :users と書くだけでこんなことになる


    • こんなことになる、ということだけ覚えておけばいいか



   Prefix Verb   URI Pattern               Controller#Action

users GET /users(.:format) users#index
POST /users(.:format) users#create
new_user GET /users/new(.:format) users#new
edit_user GET /users/:id/edit(.:format) users#edit
user GET /users/:id(.:format) users#show
PATCH /users/:id(.:format) users#update
PUT /users/:id(.:format) users#update
DELETE /users/:id(.:format) users#destroy


  • メソッド名と同じ名前で erb を用意すれば、それが描画に利用される


7.1.2 params


  • 下記のような各種リクエストパラメータは params というハッシュから参照できる


    • REST URI に含められたパラメータ

    • クエリストリング




7.1.3 debugger


  • 最強か


7.2.1 form_for



  • form_for ヘルパーを使えば、モデルのためのフォームが簡単に作れる


    • コントローラー側でモデルのまっさらなインスタンスを作ってビューに渡す


      • そのとき、コントローラー側で属性をセットしておくと、それがプレースホルダーになる



    • 作られるフォームは自動的に action="/users" method="post" となる

    • CSRF 対策までしてくれる




7.3.2 Strong Paramater


  • 上記の form_for を使うと、ユーザーの入力が params の1要素としてハッシュで追加される



    • params 自体がハッシュなので、正確には「ハッシュのハッシュ」になる



  • Rails のモデルは、更新時に属性をハッシュで渡して一発で初期化することができる


    • これをマスアサインメントと呼ぶ

    • 例 : u = User.new(name: "foo", password: "bar")



  • しかし、マスアサインメントを使うと、悪意あるユーザーが不正なパラメータを送りつけてきたときに対処ができない

  • それを防ぐために、「 params に存在していい要素」を宣言することができる

  • その仕組みを Strong Parameter という


    • この役割を担うのは コントローラ層

    • かつてはモデル層で attr_accessible を使ってやっていたらしいが、github が脆弱性を突かれて、その手法には問題があるとわかったらしい?



  • 実際には、専用のプライベートメソッド (user_params) をひとつ作り、それを使うのが慣習



    • requirepermit は、正常だった場合は self を返す(つまり params を返す)ので、このプライベートメソッドの呼び出しをマスアサインメントの引数にすればよい

    • 実装の解説はここがわかりやすい






7.3.3 app/views/share


  • アプリ全体で使う partial は app/views/share に入れるのが慣習

  • partial なのでファイル名を _ で始める(復習)


    • でも render で呼び出すときは _ は要らない。難しいな




7.3.3 pluralize


  • 引数の数値に応じて、英単語を複数形に変えたり変えなかったりするやつ


7.3.4 assert_no_difference


  • すげー


7.4.1 redirect_to


  • 以下の2つは同じ


    • redirect_to @user

    • redirect_to user_url(@user)



  • 後者の方が覚える負担が少なくていいかな

  • リダイレクトなので _path ではなく _url を使っている(復習)


7.4.2 flash


  • 割愛


7.4.3 DB の初期化

rails db:migrate:reset


7.4.4 content_tag ヘルパー


  • ruby の世界だけで html を記述できるようになるので、erb が簡潔になる効果がある


7.5.1 SSL の使用


  • config/environments 配下に、環境ごとの設定がいろいろ書いてある

  • 本番環境用の設定で、SSL の利用を強制できる