LoginSignup
33
26

More than 5 years have passed since last update.

【Rails】入力データをテーブルに保存

Posted at

アクションを作成

今回はテーブルに新しいレコードとして入力データを挿入する。
そのためコントローラにはnewアクションcreateアクションが必要になる。
とりあえずビューを表示したいので、createアクションにおける保存処理についてはあとで追加する。
新しいレコードを作成するので、newアクションの中身は以下のように記述。

users_controller.rb
class UsersController < ApplicationController

    def index
        @users = User.all
    end

    def new
        @user = User.new
    end

    def create
    end
end

ビュー側の処理で変数@userにデータを格納するので、@userの定義をした。

form_forメソッドを用いたビュー

サンプルとして会員登録画面を作成してみた。
formの使い方の詳細がわからない場合はこちらを参考に。

users/new.html.erb
<head>
    <meta charset="utf-8">
    <link rel="stylesheet" href="members.scss" type="text/css">
</head>
<h1>
    会員登録
</h1>
<body>
    <%= form_for(@user, url: users_path, method: :post) do |f| %>
        <p>
            <%= f.label :name, "アカウント名" %><br>
            <%= f.text_field :name %>
        </p>
        <p>
            <%= f.label :email, "メールアドレス" %><br>
            <%= f.email_field :email %>
        </p>
        <p>
            <%= f.label :password, "パスワード" %><br>
            <%= f.password_field :password %>
        </p>
        <p>
        <%= f.label :password_confirmation, "パスワード確認" %><br>
            <%= f.password_field :password_confirmation %>
        </p>
        <%= f.submit "登録する"%>
    <% end %>
</body>

スクリーンショット 2018-08-30 14.36.39.png

このページで入力したアカウント名、メールアドレス、パスワードをテーブルに挿入したい。
これまでの記述だと、フォームに入力して登録ボタンをクリックした後、指定したURLのページに遷移する。
特にエラーは起きないが、テーブルにデータは挿入されない。
そこで、createアクションに保存処理を記述する必要がある。

コントローラに保存処理を記述

簡単な保存処理をcreateアクションに記述すると、以下のようになる。

users_controller.rb
    def new
        @user = User.new
    end

    def create
        @user = User.new(user_params)
        if @user.save
            render 'index'
        else
            render 'new'
        end
    end

    private
        def user_params
            params.require(:user).permit(:name, :email, :password)
        end

「登録する」ボタンによってPOSTされたデータがparams
paramsの中身は下のようになっている。
スクリーンショット 2018-08-30 14.48.26.png
.require(:user)によって、このparamsから"user"部を取り出している。
さらに、.permit(:name, :email, :password)によって、nameとemail,passwordカラムへの挿入を許可している。

これらの操作によって入力されたデータを適切に取得したあとは、
saveメソッドを用いてデータをテーブルに保存した。


保存処理に成功した場合、indexアクションのページに遷移するようにしたが、
このような場合、renderredirect_toを使用することができる。

render 'アクション名'

#例
render 'index'
redirect_to rootpath

#例
redirect_to users_path

どちらも同じ機能になる。


補足

今回入力データを保存する簡単な処理を記述したが、本格的に導入するとなると

・保存トランザクションが失敗した時のロールバック処理周り
・メールアドレスやパスワードのバリデーション

などの機能が必要になってくるが、これらはまた別の記事にまとめる。

33
26
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
26