ここで、もうひとつ設定を追加しておきましょう。ログイン画面からログインした直後、ど このページが表示されましたか?gemdeviseでは、デフォルトで root (いわゆるトッ プページ)へ遷移するようになっています。これは管理画面のログインページですから、
books#index
へ移動するように変更しておきます。gemdeviseから提供されている ログイン直後のURL設定をするメソッドがありますので、以下のように変更しておいてくだ さい。class ApplicationController < ActionController::Base # Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception before_action :authenticate_user!
def after_sign_in_path_for(resource) # 追加 books_path
end end
commit
先のログイン画面も、gemdeviseがデフォルトで用意してくれているものです。ボタン などのデザインをそろえたいので、テンプレートも修正しておきましょう。テンプレートは gemから提供されるものなので、通常の編集可能なところにはファイルがありません。次 のコマンドを実行してカスタム用のテンプレートを呼び出します。
username:~/workspace (master) $ rails generate devise:views
そうすると、このように各機能に合わせたテンプレートが生成されます。
username:~/workspace (master) $ ls app/views/devise/
confirmations/ mailer/ passwords/ registrations/
sessions/ shared/ unlocks/
ログイン画面は app/views/devise/sessions/new.html.erb です。他の新規 登録のページなどを見ながら、デザインを変更してみてください。難しい人は下のコードを 参考にしてください。
<h2>Log in</h2>
<%= form_for(resource, as: resource_name, url:
session_path(resource_name)) do |f| %>
<div class="form-group">
<%= f.label :email %><br />
<%= f.email_field :email, autofocus: true, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :password %><br />
<%= f.password_field :password, autocomplete: "off", class: "form-control" %>
</div>
<% if devise_mapping.rememberable? -%>
<div class="form-group">
<%= f.check_box :remember_me %>
<%= f.label :remember_me %>
</div>
<% end -%>
<div class="actions">
<%= f.submit "Log in", class: "btn btn-default" %>
</div>
<% end %>
<%= render "devise/shared/links" %>
また、ログイン前に右のメニューが見えているのもよくないですね。これを見えないようにし ておきましょう。gemdeviseのヘルパーに、認証をしたかどうかをbooleanで判別で きる
user_signed_in? というメソッドがあるので、それを利用します。app/views/
layout/application.html.erb
を開いて、booksとtagsの部分をこのヘルパー のif文で囲ってしまいましょう。<div class="col-sm-3 col-md-2 sidebar">
<% if user_signed_in? %>
<ul class="nav nav-sidebar">
<li class="active"><a href="#">Books</a></li>
<li><a href="#">Tags</a></li>
</ul>
<% end %>
</div>
これでログインページをリロードしてみてください。サイドメニューの表示が消えましたか?
このように、認証をかけるときは、必ずコントローラとテンプレートの両方に認証をかけるよ うにしてください。
commit
(2) . ユーザ管理画面の作成
認証の設定ができましたが、このままではどのページにもアクセスできず、実装をすすめら れませんので、管理用のユーザーを db/seeds.rb に作っておきましょう。いま、User モデルはメールアドレスとパスワードしかありませんから、その2つを設定すればOKです。
ただ、パスワードは、confirmationフィールドを利用するので、
.find_or_create_by
に直接与えることはできません。どのようにすればいいか考えてdb/seeds.rbに実装し、rails db:seed
の実行までおこなってください。参考のコードを以下にはっておきます。admin = User.where(email: '[email protected]') unless admin.present?
User.create(email: '[email protected]', password: 'monka_project', password_confirmation: 'monka_project')
end
これからは、このメールアドレスとパスワードを使って、ログインしてから作業を進めてくだ
「他人が作った無料の認証システムで不安だ」という声があるかもしれません。少し考えて見ま しょう。そもそも、いまこのアプリケーションをRails/Rubyで作っていますが、そのRails/
Rubyを作ったのは誰でしょうか?それに対して、対価は支払われているのでしょうか?オープン ソースは、一人で何かを独占しようというものではありません。これらのコードはすべてプロジェク トとして、世界中のすばらしいプログラマー達によって、いいものを作ろうという意識の上に成り 立っています。それは、お互いを監視しているようにも見えますが、お互いを信頼しているように も見えます。少なくとも、プログラミングを初めていく年もたたないプログラマーが一人で作る 認証システムよりは、世界の精鋭プログラマーが作った認証システムのほうが、はるかに信頼がお けると思います。オープンソースを利用することは無料です(著作権が微妙に異なる場合があり ますので、新しいものを使うときは注意してください)。ただし、その対価を払う代わりに、オープ ンソースで作ったものは、自分で育ててメンテナンスしていかなければならないという側面もあり ます。RubyやRailsがバージョンアップしても、誰もフォローはしてくれません。アンテナをはって、
常にコミュニティーの情報を取りに行く姿勢が求められます。それを面倒と思うかどうか、どれを 選択していくかはプログラマー次第です。