[Rails]脱初心者向け!フォームオブジェクトとパラメータについて徹底解説してみた

railsアイキャッチ画像Ruby on Rails

どうも、フリーランスエンジニアのウェブ系ウシジマくんです。今回はRailsのログイン機能を実装する際に必要となる知識である、フォームオブジェクトとパラメータについての解説記事です。

正直、ちょっと内容は中級者向けなので、この記事の対象者に記載した通り、少なくともProgateのRailsコースを一回クリアしたくらいの経験はないと、内容がよくわからないかもしれません。

逆に、この内容が理解できれば、Railsの理解度も中級者レベルだと思うので、レベルアップしたい方は読んでみてください!

この記事の対象者

  • ProgateのRailsコースとRailsチュートリアルを一通りやり終えた人
  • paramsについての理解が曖昧な人
  • form_forとform_tagの違いがイマイチ理解できていない人

フォームオブジェクトとは?

AcitveRecordモデルを使わずにフォームを生成する方法。データベースとは無関係なフォームやデータベーステーブルと1対1で結びついていないフォームをform_forメソッドで生成できる。
引用:実践Ruby on Rails4現場のプロから学ぶ本格webプログラミング 161ページより

↓ わかりやすくいうと。。。

RailsでHTMLフォームを生成するためには、
* form_forメソッド
* form_tagメソッド
上記2種類の方法があります。

form_tagは単純にformタグを生成するだけなので、viewにHTMLフォームをそのまま直書きするのと正直あまり変わりません。対して、form_forは引数にモデルやコントローラーなどで定義したオブジェクト(インスタンス変数など)をとりつつ、生成するフォームのデフォルト値としてオブジェクトが持っている値(Usersテーブルに対するnameカラムに相当)を設定できます。

ただ、form_forメソッドもActiveRecord::Baseを介さずにフォームを生成することも可能。それがフィームオブジェクトで、appディレクトリにformディレクトリを作成し、そこにフォームクラスを定義するのが主流です。ただし、form_forの引数を使えるようにするため、ActiveModel::Modelをincludeする必要がある。attr_accessorで属性を定義すれば、それがそのままフォームのフィールド名になります。

Class Staff::LoginFrom
    include ActiveModel::Model

    attr_accessor :email, :password
end

参考

フォームオブジェクトについて

引用:実践Ruby on Rails4現場のプロから学ぶ本格webプログラミング 162ページより

パラメータについて

view側でform_forメソッドなどでフォームを作った際、developperツールなどで要素を検証する(該当のページを右クリックして検証を押下)と確認できますよ。

パラメータ = プレフィックス [フィールド名]

‘Staff_login_form[password]’のような形式のとき、このひとまとまりをパラメータと呼びます。
この時、Staff_login_formの部分をプレフィックス(prefix)、passwordの部分がフィールド名(field_name)になります。

プレフィックスは、デフォルトだとform_forで引数に指定したオブジェクトのクラス名を全て小文字にして、アンダースコアで連結したものになるのが特徴。ただし、form_forのasオプションを使えばプレフィックスを変更することができます。

paramsオブジェクト

staff_login_form: {
    Email: ‘hanako@example.com
    Password: ‘foobar’
}

prefix: {
    field_name1: ‘value1’
    field_name2: ‘value2’
}

図解するとこんな感じ。

paramsオブジェクト図解

コントローラのアクション内でparamsメソッドを使うと、クライアント(ブラウザ)の入力フォームからRailsアプリケーションに送られてきたデータを保持するオブジェクトを取得することができます。このオブジェクトの中にはハッシュの中にハッシュがある二次元ハッシュになって、外側のハッシュのKeyがパラメータのプレフィックス、内側のハッシュのKeyがフィールド名で、Valueがパラメータの値となっています。

取得するには、params[:パラメータの名前]のように指定することで、その値を参照することができます。
パラメータの名前はシンボルで指定しても、文字列で指定しても動きます。(でも基本的にはシンボルで指定するのが一般的)

参考

実践Ruby on Rails 4 現場のプロから学ぶ本格Webプログラミング

ちょっとしたつぶやき

2018年の6月に新しくMacBookProが出るようであれば、新調したい気持ちが強くなっている今日この頃。。。

VagrantやDockerとかでガンガン仮想化するなら、やっぱりフルスペックじゃないと重いなあ。。