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にアクセスすると作成したデータが表示されると思う。

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

 - プログラミング

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

  関連記事

no image
YosemiteでRubyMineが起動できない

yosemiteからjavaが1.7系になってる。 一方、rubymineは1.6系を想定している。 …

no image
DockerでNginxしたい

Contents1 Dockerfileを用意する2 …

no image
Swiftで追加したサードパーティなモジュールを更新する方法

SwiftにはCocoaPodsのようなライブラリを管理するツールがないので、手で追加します。 手で追加したライブラリのバージョンを更新したいときどうすればよいか。 …

no image
Androidアプリを作るために最低限必要な知識と未知の部分を列挙

作りたいアプリによって必要な知識は変わるかもしれないが。。 個人的過ぎて役に立たないが、整理がてら羅列してみる。 …

no image
意識低いRuby on Rails再入門6 ~ログイン必須のControllerを作りたい~

ログイン状態を取得するためのSessionsHelperを前に書いた 新規投稿画面を表示したり、実際に投稿するときにはログイン必須であることを保証したい。 …

no image
SwiftでOSのバージョンが8.0.0以下とそれより大きいヤツで処理を分岐させたい

前置き push通知のデバイストークン取得方法がiOS8から変わりました。 …

Chef::Exceptions::ChecksumMismatch:というエラーの対処

今頃になってChefの話。 チェックサムの形式をミスってる可能性がある。 …

no image
Mastodonインスタンス(お一人様用)を作り方メモ

Mastodonは運営の存在を気にせず罵詈雑言吐けるの便利そう。 自分用のインスタンス作ったので、便所の落書きしておく。 …

ReactとFluxとReduxについて順を追って整理する

書き途中 Contents1 …

no image
意識低いRuby on Rails再入門1

整理がてらメモ。 Contents1 …