意識低いRuby on Rails再入門3
2015/07/03
ActionViewを使ってModelクラスの新規作成画面を作りたい。
ウェブアプリ上でModelのクラスを作成する。
具体的には日記を投稿したり、つぶやきを投稿したりするアレのこと。
items/createみたいなエンドポイントに対して適当な値を付加したPOSTリクエストを投げる必要がある。
このリクエストをブラウザ上で行う場合、よくある方法の1つにフォームに必要な値を入力させて、サブミットボタンをクリックさせたりする。
上のようなことを実現するためには以下の要素が必要になる。
- 値を入力させるための画面を描画する処理をControllerに追加する
- items/createリクエストを捌く処理をControllerに追加する
- データを追加した後の画面を描画する
値を入力するための画面を描画する処理をControllerに追加する
ItemsControllerを例にすると、
1 2 3 4 5 |
def new @item = Item.new @item.title = 'sample_title' @item.body = 'sample_body' end |
newというメソッドを追加する。
新たに追加したいItemのインスタンスを生成している。
前述のとおりViewを明示的に指定しなければnew.html.slimなどのViewファイルが自動的に選択され、描画される。
Viewはこんな感じ。
items/newにアクセスすると投稿画面が表示されるはず。
1 2 3 4 5 6 |
h1 | 新規作成 = form_for @item, url: {action: "create"} do |f| = f.text_field :title = f.text_area :body = f.submit "投稿" |
ここでform_forというRailsの依存モジュールであるActionViewの機能を使っている。
通常であれば、入力フォームに関する記述は自ら書かなければいけないが、ActionViewが提供するメソッドを使うことで簡略して表記できる。
一方で、ActionViewの記法を覚える必要があるため学習コストが高いとも言える。
Railsはわりとこの辺の独自ルールを覚える必要がある。また、バージョンによってメソッドが使えたり使えなかったりと、破壊的な変更が多いフレームワークだ。
なので、ググって変な答えに飛びつくより公式ドキュメントなどを焦らずに読み込むのが習熟の近道だと思っている。
http://railsguides.jp/form_helpers.html
上記のリンクを見ればわかるが、formにも様々な記法があるので、自分のやりたいことと照らし合わせて適当なメソッドを選択したい。
↑で作った投稿画面で『投稿』ボタンを押すとactionに書かれているエンドポイントがよばれる。
ここではcreateが呼ばれるようになってる。
なので、次はcreateをControllerに追加する。
item/createリクエストを捌く処理をControllerに追加する
基礎部分はこんな感じ。
1 2 |
def create end |
このメソッドの中でやるべきことは2つ
- リクエストからItemを作るためにひつようなパラメータを抽出する
- Itemを作成してDBに保存する
1 2 3 |
def create Item.create(params[:item]) end |
これでリクエストから必要なパラメータを取得してItemクラスのデータを保存した。
しかし、実際にフォームに値を入力して投稿してみるとエラーが表示されるはず。
Rails4系からパラメータがホワイトリスト形式で監視されるようになった。
与えられたパラメータに対してこのキーの値は使えますよ、これは使えませんよと権限を指定するひつようがあるのだ。
これはセキュリティ対策のために4系からコア機能として導入されている。StrongParameterという名前らしい。
なので、ホワイトリストを作成する。
ControllerにStrongParameter用のホワイトリストを設定する
http://railsguides.jp/action_controller_overview.html#strong-parameters
ここに書いてるとおり。
1 2 3 4 5 6 7 8 |
def create Item.create(item_params) end private def item_params params.require(:item).permit(:title,:body) end |
item_paramsというプライベートメソッドを作り、create時に呼び出すようにしている。
itemというパラメータのtitle,bodyという中身をホワイトリストに追加している。
もう一度投稿してみると成功しているはず。
で、items/indexにアクセスすると作成したデータが表示されると思う。
見た目は質素すぎるが、一応投稿画面が完成した。
336px
336px
関連記事
-
-
goで無限ループ
しょ …
-
-
プログラミング入門以前
これ …
- PREV
- 意識低いRuby on Rails再入門2
- NEXT
- 意識低いRuby on Rails再入門4