0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Railsチュートリアル(第10章)

Posted at

はじめに

Railsチュートリアルの第10章が終わりました。
この章では、ユーザーの更新、表示、削除を行います。
ポイントだけメモしておきます。

ユーザーの編集

まずeditアクションでidを元にユーザーを取得します。

  def edit
    @user = User.find(params[:id])
  end

取得したユーザーを登録時と同様にform_forを使用して表示します。
書き方は登録時と一緒です。

  <%= form_for(@user) do |f| %>
    ...
  <% end %>

この時に、new_record?というメソッドを使って@userが新規のものかすでにあるものかを判断して、自動的にcreateかupdateを分けてくれます。

登録時は以下のように、update_attributesで行います。
(登録時のsave相当)

  def update
    @user = User.find(params[:id])
    if @user.update_attributes(user_params)
      # 成功
    else
      # 失敗
    end
  end

beforeフィルター

コントローラーの各アクションの前に呼ばれるメソッドを定義できます。
例えば、ログインされている場合だけアクションを実行する際、先にチェックメソッドを呼ぶといった使い方ができます。

以下のように、before_actionの後に記述します。
そのままでは全てのアクションの前に呼ばれるので、限定したい場合は、後ろにonly: "メソッドシンボルの配列"を記述します。

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

def logged_in_user
  ...
end

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

フレンドリーフォワーディングとは、簡単に言うと、
未ログイン時にAページに遷移
→ログインページにリダイレクト
→ログイン
→Aページに遷移
のように、本来のログイン後のページではなく、遷移しようとしていたページに遷移させることです。

以下のように、sessionにURLを保持しておくことで実装します。
未ログイン時のリダイレクトで覚えるメソッドを呼び、ログイン後のメソッドでリダイレクトのメソッドを呼びます。
以下のようにすると、URLがなければ引数に渡したデフォルトのURLにリダイレクトできます。
また、request.original_urlで元々遷移しようとしたURLの取得、request.get?でGETリクエストかの判定ができます。

  # 記憶したURL (もしくはデフォルト値) にリダイレクト
  def redirect_back_or(default)
    redirect_to(session[:forwarding_url] || default)
    session.delete(:forwarding_url)
  end

  # アクセスしようとしたURLを覚えておく
  def store_location
    session[:forwarding_url] = request.original_url if request.get?
  end

一覧の表示

まずindexアクションで全てのユーザーを取得します。

  def index
    @users = User.all
  end

取得した@userseachで全て表示します。

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

上記のプログラムを以下のように書くことができます。
まず、each文の内容をパーシャルにします。その際、名前を@usersの単数のuserにします。

_user.html.erb
    <li>
      <%= gravatar_for user, size: 50 %>
      <%= link_to user.name, user %>
    </li>

そして、以下のようにrender @usersと記述することで、自動的にuserのリストだと判断し1つずつパーシャルを表示します。

  <%= render @users %>

サンプルユーザーの作成

サンプルのユーザーを作成するために、実際にいそうな名前を作成してくれるfakerというgemを入れます。

Gemfile
gem 'faker', '1.7.3'

seeds.rbというファイルに記述することで、サンプルデータを定義することができます。
以下のように、timesで一気に複数作成することができます。
fakerを使用しているのはFaker::Name.nameのところです。

db/seeds.rb
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

seeds.rbに定義した内容をデータベースに反映するためには、以下のようにrails db:seedを実行します。
rails db:migrate:resetはデータベースの内容をクリアしています。

rails db:migrate:reset
rails db:seed

ページネーション

ページネーションを使用するために、以下の2つのgemを入れます。

Gemfile
gem 'will_paginate',           '3.1.6'
gem 'bootstrap-will_paginate', '1.0.0'

実際に使用する箇所に以下の記述を追加します。

<%= will_paginate %>

ただし、上記の記述だけでは表示できず、以下のように、User.paginate(page: "ページ番号")を使用して、そのページの一覧を取得する必要があります。

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

管理者権限

以下のように、管理者権限を示すadminというboolean型のカラムを追加します。
boolean型を追加すると、admin?という真偽値を判定するメソッドが使用できます。

rails generate migration add_admin_to_users admin:boolean

ユーザーの削除

削除する際は、destroyアクション内で、userのモデルに対して、destroyメソッドを呼びます。

  def destroy
    User.find(params[:id]).destroy
    flash[:success] = "User deleted"
    redirect_to users_url
  end
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?