#アクションを作成
今回はテーブルに新しいレコードとして入力データを挿入する。
そのためコントローラにはnewアクションとcreateアクションが必要になる。
とりあえずビューを表示したいので、createアクションにおける保存処理についてはあとで追加する。
新しいレコードを作成するので、newアクションの中身は以下のように記述。
class UsersController < ApplicationController
def index
@users = User.all
end
def new
@user = User.new
end
def create
end
end
ビュー側の処理で変数@userにデータを格納するので、@userの定義をした。
#form_forメソッドを用いたビュー
サンプルとして会員登録画面を作成してみた。
formの使い方の詳細がわからない場合はこちらを参考に。
<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>
このページで入力したアカウント名、メールアドレス、パスワードをテーブルに挿入したい。
これまでの記述だと、フォームに入力して登録ボタンをクリックした後、指定したURLのページに遷移する。
特にエラーは起きないが、テーブルにデータは挿入されない。
そこで、createアクションに保存処理を記述する必要がある。
#コントローラに保存処理を記述
簡単な保存処理をcreateアクションに記述すると、以下のようになる。
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の中身は下のようになっている。
.require(:user)によって、このparamsから"user"部を取り出している。
さらに、.permit(:name, :email, :password)によって、nameとemail,passwordカラムへの挿入を許可している。
これらの操作によって入力されたデータを適切に取得したあとは、
saveメソッドを用いてデータをテーブルに保存した。
保存処理に成功した場合、indexアクションのページに遷移するようにしたが、
このような場合、renderやredirect_toを使用することができる。
render 'アクション名'
#例
render 'index'
redirect_to rootpath名
#例
redirect_to users_path
どちらも同じ機能になる。
###補足
今回入力データを保存する簡単な処理を記述したが、本格的に導入するとなると
・保存トランザクションが失敗した時のロールバック処理周り
・メールアドレスやパスワードのバリデーション
などの機能が必要になってくるが、これらはまた別の記事にまとめる。