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
SeleniumでChromeを自動操作したい

Seleniumという便利なソフトウェアがあります。 これはブラウザ上の操作をスクリプト化し自動化することを目的としています。 …

no image
開発で詰まったときにググるキーワード

そもそも公式サイトやソースコード、テストコード、githubなどのissueを読む 基本的には1ヶ月から1年以内の回答しか見ないようにする …

Dockerでよく使うコマンド

随時追加 Contents1 …

no image
goで無限ループ

しょうもないが忘れるので。。

no image
sudo gem install cocoapods –preしても0.36.0が使えないとき

最新のcocoapodsそのものはインストールされてる。 なので、podコマンドを実行するときに下記のようにバージョンを指定すれば一応使える。 …

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

Modelを作り、コンソール上からデータを追加した。 次はこのデータをlocalhost:3000にアクセスしたときに表示させてみたい。 …

nokogiriでスクレイピングするときによく忘れるヤツ集

書くことで記憶を定着させる施術。 class,id以外の属性を指定してタグを探したい …

ReduxのMiddlewareについて理解したいマン

ReduxのMiddlewareの仕組みがよく分からない。 具体的な処理過程を追いかけて理解に至るまでのメモ。 …

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

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

ReactNativeでGiphyのデータを表示する

まずは下記をサクッとパクってみる。 当方、比較的AndroiderなのでAndroidで。 …