ユーザーのデータを保存できるようにする
ユーザーのデータを保存できるようにするために、データベースにusersテーブルを用意し、
それを操作するためのUserモデルを用意する。
モデルとテーブルの作成
Userモデルとusersテーブルをつくるため、ターミナルでコマンドを実行する。
【書き方】
$ rails g model User name:string email:string :モデル名 :カラム名 :データ名
$ db:migrate → データベースに変更を反映させる
- stringとは短い文字列のことで、ユーザー名やメールアドレスといった短い文字列のデータに用いる
ユーザーのデータを作る
【書き方】
user = User.new(name:”アシタカ”,email:”mononoke-hime@jiburi.com”)
user.save
- newメソッドでUserモデルのインスタンスを作成
- saveメソッドでusersテーブルに保存
同じemailで新たにユーザーを登録できないようにする
「emailの重複がないか」をチェックするためのバリデーションを追加する
「uniqueness: true」を指定することで重複をチェックできる
《models/user.rb》
class User < Application Record
validetes :email, {uniqueness: true}
end
フォームがからの場合はエラーが出るようにする
《models/user.rb》
class User < Application Record
validetes :name,{presence: true}
end
- リスト
- リスト
ユーザー機能を作る
- ユーザー一覧
- ユーザー詳細
- ユーザーの新規登録
- ユーザーの情報編集
ユーザー一覧
ユーザーに関するusersコントローラと、「ユーザー一覧ページ」のindexアクションを作る
rails g controller users index
@users = User.all
<% @users.each do |user| %>
<%= user.name %>
<% end %>
<li>
<% link_to(users,”/users/index”)%>
</li>
ユーザー詳細ページを作る
《config/routes》
get “users/index” => “users#index”
get “users/:id” => “users#show”
def show
@users = User.find_by(id: params[:id])
end
<% @users.name %>
<% @users.email %>
<%= link_to(user.name, “/users/#{user.id}”) %>
ユーザー登録機能を作る
ユーザー登録ページを表示するnewアクションを作る
《ルーティング》
get “signup” => “users#new”
《コントローラ》
def new
def
《ビュー》
<p>ユーザー名</p>
<input name=”name”>
<p>メールアドレス</p>
<input name=”email”>
<input type=”submit” value=”新規登録”>
フォームに入力された値を送信するために、2つの<input>タグの両方にname属性を指定する必要がある。
name属性の値が送信されるハッシュのキーになるため、データの内容が分かるようなname属性をそれぞれつけるようにする
createアクションでユーザーを保存する
《ルーティング》
post “users/create” => “users#create”
《ビュー》form_tagメソッドを使用し、フォームのデータがusers/createに送られるようにする。
<% form_tag(“/users/create”) do %>
<p>ユーザー名</p>
<input name=”name”> inputにname属性を指定する
<p>メールアドレス </p>
<input name=”email”>
<% end %>
《コントローラ》
def create ← createアクションを作成
def create
①@user = User.new(name: params[:name], email: params[:email])
②@user.save
③redirect_to(“/users/#{@user.id}“). ←つまりポイント
def
①createアクションの中でフォームから送信された値を受け取れるようにする
②受け取ったデータを保存できるようにする
③保存したユーザーのユーザー詳細ページにリダイレクトする
保存に失敗した時と成功した時の処理を追加する
成功した時:サクセスメッセージを表示する
失敗した時:①フォームを表示する ②エラー文を表示する ③フォームに初期値を入れる
ユーザーの保存に成功したかどうかで処理を分ける
if @user.save
flash[:notice] = “ユーザー登録が完了しました” ←ユーザーの保存が成功した時の処理
redirect_to(“/users/#{@user.id}”)
else
render(“/users/new”) ← ユーザーの保存に失敗した時の処理
end (ユーザー登録ページを再表示するようにする)
このままでは、ユーザー登録ページにアクセスしたときにエラーが出るので、これを解決しておく。
def new
@user = User.new
end
フォームにエラーメッセージが表示されるようにする
<% @user.errors.full_messages.each do |message| %>
<%= message %>
<% end %>
フォームの初期値
<p>ユーザー名</p>
<input name=”name” value=”アシタカ”> 初期値として入力される
<p>メールアドレス </p>
<input name=”email” value=”yakkuru@mononoke.com”>
|
| value属性にRubyを埋め込むと
↓
<p>ユーザー名</p>
<input name=”name” value=<%= @user.name %>”>
<p>メールアドレス </p>
<input name=”email” value=”<%= @user.email %>”>
ユーザー編集機能を作る
Step1 ユーザー編集ページの作成
ユーザー編集ページのURLには「localhost:3000/users/1/edit」のように、
編集するユーザーのidを含め、ユーザー編集フォームには初期値を設定しておく。
《ルーティング》
get “users/:id/edit” => “users#edit”
「localhost:3000/users/1/edit」などのURLにアクセスしたときにUsersコントローラーのeditアクションを呼び出すルーティングをさくせい。
《コントローラ》
def edit
@user = User.find_by(id: params[:id])
end
editアクションの中で、URLから取得した「:id」とfind_byメソッドを使って、ユーザーのデータを取り出す処理を作成
《ビュー》
<p>ユーザー名</p>
<input name="name" value="<%= @user.name %>">
<p>メールアドレス</p>
<input name="email" value="<%= @user.email %>">
<input type="submit" value="保存">
edit.html.erbファイルを作成し、その中にユーザー情報編集フォームを作成する。
初期値として、nameとemailが表示されるようにする
Step2 変更の保存
《ルーティング》
post “user/:id/update” => “user#update”
updateアクションのルーティングを作成する。
データを送信するので、ここでは「post」を使う
《ビュー》
<%= form_tag(“/users/#{@user.id}/update”) do%>
<p>ユーザー名</p>
<input name="name" value="<%= @user.name %>">
<p>メールアドレス</p>
<input name="email" value="<%= @user.email %>">
<input type="submit" value="保存">
<% end %>
ユーザー編集ページのフォームに入力した内容をデータベースに保存できるようにする。
そのためには、ユーザー編集ページで「保存」ボタンが押されたときに、/users/1/updateにフォームのデータが送信されるようにする。
《コントローラ》
updateアクションでデータを受け取り、そのデータからユーザー情報を取得して、新しい情報をデータベースに保存されるようにする。
①.find_byメソッドでユーザーデータを取得する
②ユーザーのデータの値を書き換える
③saveメソッドでデータを保存する
Step3 サクセス・エラーメッセージの表示
def update
@user = User.find_by(id: params[:id])
@user.name = params[:name]
@user.email = params[:email]
if @user.save
flash[:notice] = “ユーザー情報を編集しました”
redirect_to(“/users/#{@user.id}”)
else
render(“users/edit”)
コメント