ユーザ登録機能の追加

gemについて

Railsでの開発が早い理由の一つにさまざまなgemの存在があります。 ここでは、deviseというユーザ登録機能のgemを用いて、 簡単に複雑な処理を追加できることを体感してみましょう。

deviseのインストール

Gemfileに

gem 'devise'

と追加し

bundle install
rails g devise:install

と利用できる状態にします。

deviseの設定

config/environments/development.rbに

config.action_mailer.default_url_options = { host: 'localhost:3000' }

を追加

config/routes.rbに

root 'nicknames#show'

を追加

app/views/layouts/application.html.erbの<%= yield %>直前に

<p class="alert"><%= alert %></p>

を追加

rails g devise User
rake db:migrate

でユーザ登録用モデル作成

app/views/layouts/application.html.erbのheader部<ul></ul>間に下記を追加


    <% if user_signed_in? %>
      <li><%= link_to 'プロフィール変更', edit_user_registration_path %></li>
      <li><%= link_to "ログアウト", destroy_user_session_path, method: :delete %></li>
    <% else %>
      <li><%= link_to "サインイン", new_user_registration_path %></li>
      <li><%= link_to "ログイン", new_user_session_path %></li>
    <% end %>

さらに、その下の</ul>のあとに、

    <% if user_signed_in? %>
      Logged in as <strong><%= current_user.email %></strong>.
    <% end %>

も追加しましょう。

これで、動作確認してみましょう。

deleteへのアクセス制限

app/controllers/nicknames_controller.rbの最初の方に


before_action :authenticate_user!, only: :delete

を追加する。

管理者だけにするには?

簡便な方法ですので、リリースするようなアプリケーションでは、 別途方法を検討すべきですが、Rubyが使えれば下記のような書き換えで、 管理者だけにすることでもできます。

app/views/layouts/application.html.erbを開きulの内部を下記のように変えてみましょう。 ユーザhosokawa@keiei.shikoku-u.ac.jpだけに削除できるようになります。

  <li><%= link_to "トップページ",    '/nicknames/show' %></li>
  <% if user_signed_in? %>
    <li><%= link_to "ニックネーム登録",    '/nicknames/create' %>
    <% if current_user.email == 'hosokawa@keiei.shikoku-u.ac.jp' %>
      <li><%= link_to "ニックネーム削除",    '/nicknames/delete' %></li>
    <% end %>
    <li><%= link_to 'プロフィール変更', edit_user_registration_path %></li>
    <li><%= link_to "ログアウト", destroy_user_session_path, method: :delete %></li>
  <% else %>
    <li><%= link_to "ログイン", new_user_session_path %></li>
      <li><%= link_to "ユーザ登録", new_user_registration_path %></li>
  <% end %>
  </ul>
  <% if user_signed_in? %>
    <div class="right">
      <strong class="right"><%= current_user.email %></strong>でログインしています。
    </div>
  <% end %>