moxt

Just another Blog site

意識低いRuby on Rails再入門3

      2015/07/03

ActionViewを使ってModelクラスの新規作成画面を作りたい。

ウェブアプリ上でModelのクラスを作成する。
具体的には日記を投稿したり、つぶやきを投稿したりするアレのこと。

items/createみたいなエンドポイントに対して適当な値を付加したPOSTリクエストを投げる必要がある。
このリクエストをブラウザ上で行う場合、よくある方法の1つにフォームに必要な値を入力させて、サブミットボタンをクリックさせたりする。

上のようなことを実現するためには以下の要素が必要になる。

  • 値を入力させるための画面を描画する処理をControllerに追加する
  • items/createリクエストを捌く処理をControllerに追加する
  • データを追加した後の画面を描画する

値を入力するための画面を描画する処理をControllerに追加する

ItemsControllerを例にすると、

newというメソッドを追加する。
新たに追加したいItemのインスタンスを生成している。
前述のとおりViewを明示的に指定しなければnew.html.slimなどのViewファイルが自動的に選択され、描画される。

Viewはこんな感じ。
items/newにアクセスすると投稿画面が表示されるはず。

ここでform_forというRailsの依存モジュールであるActionViewの機能を使っている。
通常であれば、入力フォームに関する記述は自ら書かなければいけないが、ActionViewが提供するメソッドを使うことで簡略して表記できる。

一方で、ActionViewの記法を覚える必要があるため学習コストが高いとも言える。
Railsはわりとこの辺の独自ルールを覚える必要がある。また、バージョンによってメソッドが使えたり使えなかったりと、破壊的な変更が多いフレームワークだ。

なので、ググって変な答えに飛びつくより公式ドキュメントなどを焦らずに読み込むのが習熟の近道だと思っている。

http://railsguides.jp/form_helpers.html

上記のリンクを見ればわかるが、formにも様々な記法があるので、自分のやりたいことと照らし合わせて適当なメソッドを選択したい。

↑で作った投稿画面で『投稿』ボタンを押すとactionに書かれているエンドポイントがよばれる。
ここではcreateが呼ばれるようになってる。

なので、次はcreateをControllerに追加する。

item/createリクエストを捌く処理をControllerに追加する

基礎部分はこんな感じ。

このメソッドの中でやるべきことは2つ

  • リクエストからItemを作るためにひつようなパラメータを抽出する
  • Itemを作成してDBに保存する

これでリクエストから必要なパラメータを取得してItemクラスのデータを保存した。

しかし、実際にフォームに値を入力して投稿してみるとエラーが表示されるはず。

Rails4系からパラメータがホワイトリスト形式で監視されるようになった。
与えられたパラメータに対してこのキーの値は使えますよ、これは使えませんよと権限を指定するひつようがあるのだ。
これはセキュリティ対策のために4系からコア機能として導入されている。StrongParameterという名前らしい。

なので、ホワイトリストを作成する。

ControllerにStrongParameter用のホワイトリストを設定する

http://railsguides.jp/action_controller_overview.html#strong-parameters

ここに書いてるとおり。

item_paramsというプライベートメソッドを作り、create時に呼び出すようにしている。
itemというパラメータのtitle,bodyという中身をホワイトリストに追加している。

もう一度投稿してみると成功しているはず。
で、items/indexにアクセスすると作成したデータが表示されると思う。

見た目は質素すぎるが、一応投稿画面が完成した。

 - プログラミング

336px




336px




  • このエントリーをはてなブックマークに追加
  • follow us in feedly

  関連記事