railsのキホンvol.6（ユーザー登録、編集など）

##ユーザー機能

まずusersテーブルを用意する。
今回はユーザーネームとメールアドレスのみ。

```
$ rails g model User name:string email:string
$ rails db:migrate
```
↑のコマンドにより、usersテーブルを作る。

新規登録のバリデーションを作る

```models/user.rb
#空白に対するバリデーション
validates :name,{presence:true}
#空白と重複に対するバリデーション
validates :email,{presence:true,uniqueless:true}
```

###ユーザーの一覧
以下のようにしてindexアクションでユーザー一覧ページを作る。

```users_controller.rb
def index
    @users = User.all
end
```

 ```users/index.html.erb
<div class="main users-index">
  <div class="container">
    <h1 class="users-heading">ユーザー一覧</h1>
    <% @users.each do |user| %>
      <div class="users-index-item">
        <div class="user-right">
　　　　　　#ユーザー詳細へのリンク
          <%= link_to(user.name, "/users/#{user.id}") %>
        </div>
      </div>
    <% end %>
  </div>
</div>
```

###ユーザー詳細
showメソッドを用いる。

```users_controller.rb
def show
    @user = User.find_by("id: params[:id]")
end
```

```users/show.html.erb
<div class="main user-show">
  <div class="container">
    <div class="user">
      < h2><%= @user.name %></h2>
      <p><%= @user.email %></p>
      #ユーザー編集へのリンク、このままだと誰でも編集できてしまうのであとで編集する
      <%= link_to("編集", "/users/#{@user.id}/edit") %>
    </div>
  </div>
</div>
```

###ユーザー登録
####ユーザー登録ページの作成
newアクションでユーザー新規登録画面を作る

```users_controller.rb
def new
    @user = User.new
end
```
```users/new.html.erb
<div class="main users-new">
  <div class="container">
    <div class="form-heading">新規ユーザー登録</div>
    <div class="form users-form">
      <div class="form-body">
       #新規登録に失敗した時、エラーメッセージ表示
        <% @user.errors.full_messages.each do |message| %>
          <div class="form-error">
            <%= message %>
          </div>
        <% end %>
        
　　　　 #クリエイトアクションにフォームデータを送る、またvalueは新規登録失敗した時の値として表示用
        <%= form_tag("/users/create") do %>
          <p>ユーザー名</p>
          <input name="name" value="<%= @user.name %>">
          <p>メールアドレス</p>
          <input name="email" value="<%= @user.email %>">
          <input type="submit" value="新規登録">
        <% end %>
      </div>
    </div>
  </div>
</div>
```


####ユーザーの保存
createアクションを作り、データベースに情報を保存する。

```users_controller.rb
def create
    #新しくインスタンスを作る
    @user = User.new(name: params[:name], email: params[:email])
    #成功した場合はフラッシュメッセージとともに詳細画面
    #失敗した場合はエラーメッセージとともに新規登録画面
    if @user.save
      flash[:notice] = "ユーザー登録が完了しました"
      redirect_to("/users/#{@user.id}")
    else
      render("users/new")
    end
end
```
###編集の保存
editファイルで編集の保存を行う。

```users/edit.html.erb
<div class="main users-edit">
  <div class="container">
    <div class="form-heading">アカウント編集</div>
     <div class="form users-form">
      <div class="form-body">
        <!-- エラーメッセージを表示するためのHTMLを貼り付けてください -->
        <% @user.errors.full_messages.each do |message| %>
          <div class="form-error">
            <%= message %>
          </div>
        <% end %>
        
        <!-- フォームの送信先を指定してください -->
        <%= form_tag("/users/#{@user.id}/update") do  %>
          <p>ユーザー名</p>
          <!-- name属性を設定してください -->
          <input name="name" value="<%= @user.name %>">
          <p>メールアドレス</p>
          <!-- name属性を設定してください -->
          <input name="email" value="<%= @user.email %>">
          <input type="submit" value="保存">
        <!-- endを追加してください -->
        <% end %>
      </div>
     </div>
    </div>
  </div>
</div>
```

```users_controller.rb
def edit
    @user = User.find_by(id: params[:id])
end
```

ルーティングはこちら。

```routes.rb
Rails.application.routes.draw do
  
  post "users/:id/update" => "users#update"
  
  get "users/:id/edit" => "users#edit"
  post "users/create" => "users#create"
  get "signup" => "users#new"
  get "users/index" => "users#index"
  get "users/:id" => "users#show"

  get "posts/index" => "posts#index"
  get "posts/new" => "posts#new"
  get "posts/:id" => "posts#show"
  post "posts/create" => "posts#create"
  get "posts/:id/edit" => "posts#edit"
  post "posts/:id/update" => "posts#update"
  post "posts/:id/destroy" => "posts#destroy"
  
  get "/" => "home#top"
  get "about" => "home#about"
end
```
続き
https://qiita.com/jonnyjonnyj1397/items/1ce541775901561fc136