Rails – form_withとモデルの使い方

概要

form系ヘルパーではフォームの入力がparams変数にセットされるが、一般には以下の様な流れで入力パラメーターを利用する。

  • form_with/form_forで読み込んだパラメーターをモデルにセットする
  • モデルへのパラメーターのセットは、慣習的にprivateのメソッドを準備して、それを介する
  • 各パラメーターは、モデルインスタンスのプロパティーとして参照・利用

モデルによるフォームデータの取得も参照。

例示

基本構造

流れ

  • トップページに入力フォームを表示
    • /top
    • app/controllers/pages_controller#top
    • app/views/pages/top.html.erb
  • フォーム入力をpagesコントローラーのinputアクションへ送信
    • app/controllers/pages_controller#input
  • inputアクションでフォーム入力をUserモデルインスタンスに格納して表示

入力フォーム

form_withによる以下のようなフォームを例にする。フォームビルダーのtext_fieldpassword_fieldに入力された値が送信される。

注意点

form_withはデフォルトでajaxによるフォーム送信となり、ページ全体がレンダリングされない。HTMLとして送信してレンダリングするには、パラメーターにlocal: trueを指定する。

<%= form_with(url:/model: ***, local: true) %>

モデルとデータベース

データを扱うモデルは以下で生成し、マイグレートしてテーブルを作成しておく

テーブル

コントローラー

以下の枠組みでコントローラーを生成。ビューのform_withでモデルを使うため、Userインスタンスを生成している。

ルーティング

  • アプリケーション起動時にtopページを表示
  • 入力POST時にinputアクションへルーティング

入力データのモデルへのセット

コントローラーに以下に様に追記。

要点は次のとおり。

パラメーターを引数にしてモデルインスタンスを与える。

変数 = モデルクラス.new(モデル名_params)

引数はモデルに与えるparamsを返すメソッドで、慣習としてメソッド名の付け方、praivate宣言、requirepremitによるパラメーター取得が定まっている。

params.require(:モデル名).permit(:要素名, ...)

モデルにパラメーターがセットされた後は、要素名と同じモデルのプロパティーで値を取得。

コンソールの出力部分は以下のとおり

require/permitメソッド

フォームの入力をモデルにセットする際、requirepermitでパラメーターを指定している。

たとえば悪意のあるユーザーによってPOSTされる要素が追加された場合でも、必要なパラメーターのみを参照・変更することができる。

そして上述のように、一般的にはrequirepermitのメソッドチェーンをprivateメソッドでラップして使う。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です