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 %>
この記事が気に入ったらサポートをしてみませんか?