Rails チュートリアル

10.1 ユーザー更新

ユーザー情報を編集するパターンは、新規ユーザーの作成と似ている。
新規ユーザー用のビューを出力するnewアクションと同じでユーザーを編集するためのeditアクションを作成する。patchリクエストに応答するupdateアクションを作成

10.1.1 編集フォーム

1,usersコントローラーにeditアクション作成
2, editビューを実装する

def edit
@user = User.find(params[:id])
end
<% 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"

<li><%= link_to "Settings", edit_user_path(current_user) %></li>

編集の失敗

  def update
   @user = User.find(params[:id])
   if @user.update(user_params)
     # 更新に成功した場合を扱う。
   else
     render 'edit'
   end
 end

パスワードが空のママでも更新出来るようにする

validates:password, presence:true, length:{minimum:6}, allow_nil:true

10.2 認可

ウェブアプリケーションの文脈では、認可はサイトのユーザーを識別することであり認可はそのユーザーが実行可能な操作を管理する。

10.2.1ユーザーにログインを要求する

Userコントローラーの中でbefore_actionメソッドを使い何らかの処理が実行される直前に特定のメソッドを実行する仕組み。logged_in_userメソッドを定義してる
before フィルターにlogged_in_userを追加

ただしいユーザーを要求する
ログインだけではなく、ユーザーが自分の情報だけを編集出来るようにする

beforeフィルターを使い編集/更新する

before_action:correct_user, only:[:edit,:update]

current_user?メソッド

def current_user?
user && user == current_user
end

最終的なcurrent_userの実装する

redirect_to(root_url)unless current_user?(@user)

フレンドリーフォワーディング

保護されたページにアクセスすると自分のプロフィールページに移動點せられる。
store_location,redirect_back_orの2つのメソッドを使い実現
フレンドリーフォワーディングを備えたcreateアクション

redirect_back_ or user


すべてのユーザーを表示する

ユーザーアクションであるindexアクションを追加する
アクションはすべてのユーザを一覧表示します。ユーザー出力のページネーションの方法を学ぶ

ユーザーの一覧ページ
ユーザの一覧ページを実装するために、セキュリティモデルについて考える。ユーザーshowページについてはユーザーのindexページはログインしたユーザーにしか見せない未登録のユーザーがデフォルトで表示出来るページを制限

beforeフィルターのlogged_in_userにindexアクションを追加してアクションを保護

indexアクションにはログインを要求する

before_action:logged_in_user, only:[:index, :edit, :update]

ユーザーのindexアクション

def index
 @users = User.
end

ユーザーのindexビュー

<% provide(:title, 'All users') %>
<h1>All users</h1>

<ul class="users">
 <% @users.each do |user| %>
   <li>
     <%= gravatar_for user, size: 50 %>
     <%= link_to user.name, user %>
   </li>
 <% end %>
</ul>

gravatar_forヘルパーにオプション引数を追加

module UsersHelper

 # 渡されたユーザーのGravatar画像を返す
 def gravatar_for(user, options = { size: 80 })
   size         = options[:size]
   gravatar_id  = Digest::MD5::hexdigest(user.email.downcase)
   gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}?s=#{size}"
   image_tag(gravatar_url, alt: user.name, class: "gravatar")
 end
end

ユーザー一覧ページへのリンクを更新する

<li> <%= link_to "Users", users_path %> </li>

サンプルのユーザー

gemfile に Faker gemを追加す

gem 'faker', '2.1.2'

サンプルユーザーを生成しRubyスクリプトを追加

データーベース上にサンプルユーザーを生成するRailsタスク

User.create!(name:  "Example User",
            email: "example@railstutorial.org",
            password:              "foobar",
            password_confirmation: "foobar")

# 追加のユーザーをまとめて生成する
99.times do |n|
 name  = Faker::Name.name
 email = "example-#{n+1}@railstutorial.org"
 password = "password"
 User.create!(name:  name,
              email: email,
              password:              password,
              password_confirmation: password)
end

ページネーション

 一つのページに大量のユーザーが表示されてしまっている。これをページネーションでかいけつ

Gemfileにwill_paginateに追加

gem 'will_paginate', '3.1.8'
gem 'bootstrap-will_paginate', '1.0.0'

indexページでpaginationを使う

<%= will_paginate %>

indexアクションでUsersをページネートする

@users = User.paginate(page:params[:page])

パーシャルのリファクタリング

コンパクトなビューを作成しするために素晴らしいツールがいくつもあります。render呼び出しに置き換える

<%= render user %>

ユーザーを削除

ユーザーの一覧ページはついに完了しました。残るはdestroy
ユーザーを削除するためのリンクを追加します。削除を実行出来る権限を持つ管理ユーザーのクラスを作成する。承認においてこのような特権のセット
role と呼びます

管理ユーザー

マイグレーションを実行しadmin属性。属性の型をbooleanと指定

rails g migration add_admin_to_users_ admin:boolean

boolean型のadmin 属性をUserに追加するマイグレーション

add_column :users, :admin, :boolean, default:false

Strong Parameters 再び

初期化ハッシュにadmin: trueを設定するユーザーを管理者にしている

destroyアクション


ユーザー削除用リンクの実装

<% if current_user.admin? &&  !current_user?(user) %>
| <%= link_to "delete", user, method: delete,
data:{comfirm:"You sure?"} %>
<% end %>












この記事が気に入ったらサポートをしてみませんか?