railsチュートリアル第10章 データを更新する

#ユーザーの更新・表示・削除
edit、update、index、destroyアクション
RESTアクションを完成
認可モデル（Authorization Model）について説明
すべてのユーザーを一覧できるようにします
サンプルデータとページネーション（pagination）を導入する
ユーザーを削除し、データベースから完全に消去する機能を追加します。
管理ユーザーという特権クラスを作成し、このユーザーにのみ削除を許可するようにします

##ユーザーを更新する
edit、updateアクションを作成する。

```
$ git checkout -b updating-users
```

###編集フォーム
####ユーザーのeditアクション
app/controllers/users_controller.rb

```rb
class UsersController < ApplicationController
.
.
.
  def edit
    @user = User.find(params[:id])
    # データベースから探す
  end
  
  private
  #外部から使えないようにする
  
    def user_params
    # Usersコントローラの内部でのみ実行される
    # Web経由で外部ユーザーにさらされない
       params.require(:user).permit(:name, :email, :password,
                                   :password_confirmation)
    end
end
```

####ユーザーのeditビュー
app/views/users/edit.html.erb

```rb
<% provide(:title, "Edit user") %>
<h1>Update your profile</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= form_with(model: @user, local: true) do |f| %>
      <%= render 'shared/error_messages' %>

      <%= f.label :name %>
      <%= f.text_field :name, class: 'form-control' %>

      <%= f.label :email %>
      <%= f.email_field :email, class: 'form-control' %>

      <%= f.label :password %>
      <%= f.password_field :password, class: 'form-control' %>

      <%= f.label :password_confirmation, "Confirmation" %>
      <%= f.password_field :password_confirmation, class: 'form-control' %>

      <%= f.submit "Save changes", class: "btn btn-primary" %>
    <% end %>

    <div class="gravatar_edit">
      <%= gravatar_for @user %>
      <a href="https://gravatar.com/emails" target="_blank">change</a>
    </div>
  </div>
</div>
```
####レイアウトの “Settings” リンクを更新する
app/views/layouts/_header.html.erb

```html
<header class="navbar navbar-fixed-top navbar-inverse">
  <div class="container">
    <%= link_to "sample app", root_path, id: "logo" %>
    <nav>
      <ul class="nav navbar-nav navbar-right">
        <li><%= link_to "Home", root_path %></li>
        <li><%= link_to "Help", help_path %></li>
        <% if logged_in? %>
          <li><%= link_to "Users", '#' %></li>
          <li class="dropdown">
            <a href="#" class="dropdown-toggle" data-toggle="dropdown">
              Account <b class="caret"></b>
            </a>
            <ul class="dropdown-menu">
              <li><%= link_to "Profile", current_user %></li>
              <li><%= link_to "Settings", edit_user_path(current_user) %></li>
              <li class="divider"></li>
              <li>
                <%= link_to "Log out", logout_path, method: :delete %>
              </li>
            </ul>
          </li>
        <% else %>
          <li><%= link_to "Log in", login_path %></li>
        <% end %>
      </ul>
    </nav>
  </div>
</header>
```
###演習
1.
先ほど触れたように、target="_blank"で新しいページを開くときには、セキュリティ上の小さな問題があります。それは、リンク先のサイトがHTMLドキュメントのwindowオブジェクトを扱えてしまう、という点です。具体的には、フィッシング（Phising）サイトのような、悪意のあるコンテンツを導入させられてしまう可能性があります。Gravatarのような著名なサイトではこのような事態は起こらないと思いますが、念のため、このセキュリティ上のリスクも排除しておきましょう。対処方法は、リンク用のaタグのrel（relationship）属性に、"noopener"と設定するだけです。早速、リスト 10.2で使ったGravatarの編集ページへのリンクにこの設定をしてみましょう。

```html
<div class="gravatar_edit">
      <%= gravatar_for @user %>
      <noopener href="https://gravatar.com/emails" target="_blank">change</noopener>
    </div>
```
2.
リスト 10.5のパーシャルを使って、new.html.erbビュー（リスト 10.6）とedit.html.erbビュー（リスト 10.7）をリファクタリングしてみましょう（コードの重複を取り除いてみましょう）。ヒント: 3.4.3で使ったprovideメソッドを使うと、重複を取り除けます3 。

貼り付けるだけ