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
ファイルとかのパーミッションを再帰的に変更したい

あるディレクトリ以下全ファイルのパーミッションを再帰的に変更 chmod …

no image
RDSの特定のデータベースをダンプする

Publicly Accessibleがyesならどこからでも下記が実行可能。 …

no image
Docker導入したらどうするの?

Dockerを導入したけど、nginxが入った環境がどこでも使えるようになった!程度だったらあんま意味ないよね。 Web開発をする上でDockerをどのように使うのが効果的か考えてみる。 …

no image
RubyMine(OSX)でGit操作するときのコマンド集

GITを操作系のポップアップを表示したい

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

書き途中 Contents1 …

no image
Rubyのモジュール機能とRailsのHelperについて考える

Moduleとは 参考サイトを見ながら思ったことをメモ …

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

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

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

下記の内容を読んでテスト系の処理をすっ飛ばしたメモ。 http://railstutorial.jp/chapters/sign-in-sign-out?version=4.0#top …

no image
Python(Anaconda)とOpenCVを使って動画から顔画像を抽出してみる

今話題のディープラーニングをやってみたい。 いろいろ見た感じCaffeというフレームワークが良さそう。 …

no image
Toolbarで表示する矢印アイコンの色を変えたい

http://stackoverflow.com/questions/26788464/how-to-change-color-of-the-back-arrow-in-the-new-material-theme 動的に色を変えるイイカンジな方法が分からず困っていた。 …