Railsでform_forを使うための準備

Ruby on Railsは、投稿フォームなど何かしらのフォームを作る仕組みをいくつか持っています。今回はその中で、form_forと呼ばれる仕組みを使ってフォームを作成するにあたり、前提条件と実装の方法をできるだけわかりやすく解説していきます。

form_forとはなにか?に関しては、ここでは割愛させていただきます。一言でいえばモデル専用のフォームを作成するためのものです。

モデルがいまいち分からない方へ

詳細については、インターネット上に様々な解説記事が出ています。
ここでのモデルとは、rails g model で作ったデータ、と捉えていただいて構いません。

前提条件

form_forを使うには、クリアしなければいけないいくつかの前提条件があります。Railsの思想を考慮した言い方をすれば、「ルールに従う」です。

ルールは以下。対象となるモデル名は User だとします。

1. routes.rb に /users/create (POST) や /users/:id (PATCH/PUT) が設定されている
2. users_controller.rb に create と update が定義されている
1番目のルールに関しては、以下のような設定をいいます。

Rails.application.routes.draw do
    post '/users/create' => 'users#create'
    patch '/users/:id' => 'users#update'
    put '/users/:id' => 'users#update'
end

もちろん、以下のようにRailsが用意している resources という記述を使うこともできます。Users モデルの場合は、以下のように resources を使うと、モデルに必要なルーティング設定を自動で追加してくれます。

Rails.application.routes.draw do
    resources :users
end

1番目のルールはクリアしました。2番目のルールも簡素です。

class UsersController < ApplicationController
    def create
    end

    def update
    end
end

これで、全ての前提条件はクリアしました。

あとは、フォームを記述するだけでRails側が create / update アクションに処理を振り分けてくれます。form_forの書き方の詳細についてはここでは触れませんが、こんな感じですね。

<div>
    <%= form_for @user do |f| %>
        <div>
            <%= f.label :name %>
            <%= f.text_area :name %>
        </div>
        <%= f.submit %> 
    <% end %>
</div>

f.submit の箇所は「Create User」または「Update User」となって表示されるはずですが、前者なら UsersController の create アクションへ、後者なら UsersController の update アクションへそれぞれ処理が移ります。

モデルの初期化の違いが挙動の違いを生む

また、モデルの初期化の仕方にも言及しておきましょう。なぜこれに言及するかというと、モデルの初期化の仕方というのがフォームの挙動に影響を与えるからです。まずはコードをみましょう。

def new
    @user = User.new
end

def edit
    @user = User.find(params[:id])
end

new と edit で @user の初期化の仕方が違うと思います。これはどういう違いなのかというと、前者は「データベースに存在しない値を新しく生成して初期化」しているのに対し、後者は「データベースに存在する値を取得して初期化」しているのです。 form_for はこの違いをキャッチします。

form_for は、前者で初期化された場合は create アクションへ。後者で初期化された場合は update アクションへフォームのデータを送信しようとします。

フォームデータの受け取り方

送られてきたフォームデータは全て params に入っていますが、取り出し方があります。まずはこちらのメソッドを users_controller.rb に定義してください。

def user_params
    params.require(:user).permit(:name)
end

こちらのメソッドの役割は、「params から user キーを使ってデータを取り出し、取り出したデータからさらに name に絞った値を返す」です。

ここで注意したいのが、permit にモデルが必要とするデータを指定しなければいけないということです。今回の場合は name のみですが、他のモデルでは何個か存在することでしょう。

さて、次は上で定義した関数を使ってデータを取り出しましょう。まずは create アクションからです。

def create
    @user = User.new(user_params)
end

以上です。 users_params を使って User を初期化し、それを @user に代入しています。あとは .save なり呼び出すことで、データベースへの保存が成功します。

続いて update アクションです。

def update
    @user.update(user_params)
end

以上です。これで、データベース上の値もフォームから受け取ったデータで更新されます。

あとがき

いかがでしたでしょうか?モデルに強く関係するフォームを作りたい場合に form_for を使うと、少ないコードでモデルのためのフォームを作ることができます。Railsはこのように、ルールを覚えれば記述するコード量を少なくできたりする仕組みがあります。どんどん活用していきたいですね。

この記事が気に入ったらサポートをしてみませんか?