\ プログラミング学習奮闘記録 /

Progate学習メモ Ruby on Rails5【SNSを作る④〜ユーザー〜】

目次

ユーザーのデータを保存できるようにする

ユーザーのデータを保存できるようにするために、データベースに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

  1. newメソッドでUserモデルのインスタンスを作成
  2. 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アクションを作る

STEP
ターミナルで、usersコントローラを作成する

rails g controller users index

STEP
indexアクション内で、ユーザーデータを全件取得し変数を@usersに設定する

@users = User.all

STEP
ビューファイルの中でeach文を使用しユーザー名を表示する

<% @users.each do |user| %>

<%= user.name %>

<% end %>

STEP
ヘッダーからユーザー一覧にアクセスできるようにする

<li>

 <% link_to(users,”/users/index”)%>

</li>

ユーザー詳細ページを作る

STEP
「localhost:3000/users/1」などのURLにアクセスしたときに、Usersコントローラーのshowアクションを呼び出すルーティングを作成する

《config/routes》

get “users/index” => “users#index”
get “users/:id” => “users#show”

STEP
showアクションを追加する

def show
@users = User.find_by(id: params[:id])
end

STEP
ビューファイルを作り、ユーザー名とメールアドレスを表示させる

<% @users.name %>

<% @users.email %>

STEP
ユーザー一覧に表示されているユーザー名の部分を、ユーザー詳細ページへのリンクにする

<%= link_to(user.name, “/users/#{user.id}”) %>

ユーザー登録機能を作る

STEP
ユーザー登録ページの作成

ユーザー登録ページを表示する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属性をそれぞれつけるようにする

STEP
ユーザーの保存

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アクションの中でフォームから送信された値を受け取れるようにする

②受け取ったデータを保存できるようにする

③保存したユーザーのユーザー詳細ページにリダイレクトする

STEP
サクセス・エラーメッセージの表示

保存に失敗した時と成功した時の処理を追加する

成功した時:サクセスメッセージを表示する

失敗した時:①フォームを表示する ②エラー文を表示する ③フォームに初期値を入れる

ユーザーの保存に成功したかどうかで処理を分ける

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”)

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次