Konfigurasi Devise Gem Untuk Ruby on Rails 7

Apa itu Devise

Devise adalah sebuah gem atau package untuk sistem autentikasi untuk Ruby on Rails yang sangat memudahkan dalam mengatur user, autentikasi, role, dsb.

Permasalahan

Di Ruby on Rails 7, kita harus melakukan sedikit konfigurasi tambahan untuk menjalankan atau menginstall Devise gem.

Saat ini Devise gem belum memiliki dokumentasi resmi untuk konfigurasi Devise di Rails 7. Beruntungnya, disini saya memiliki contoh sumber yang sudah melakukan konfigurasi tambahan sehingga devise gem bisa berjalan dengan lancar source

Step by Step Pengerjaan

tambahkan devise gem pada projek

bundle add devise

install devise

rails generate devise:install

generate model baru dengan tambahan field atau attribute role

rails generate devise User role:integer

migrasi

rails db:migrate

generate tampilan / views devise

rails generate devise:views

tambah controller untuk parent devise

app/controllers/turbo_devise_user_controller.rb

class TurboDeviseUserController < ApplicationController
  class Responder < ActionController::Responder
     def to_turbo_stream
       controller.render(options.merge(formats: :html))
           rescue ActionView::MissingTemplate => error
       if get?
         raise error
       elsif has_errors? && default_action
         render rendering_options.merge(formats: :html, 
             status: :unprocessable_entity)
       else
         redirect_to navigation_location
       end
     end
   end
 
   self.responder = Responder
   respond_to :html, :turbo_stream
 end

inisialisasi parent controller ke initializers devise

config/initializers/devise.rb

# frozen_string_literal: true

class TurboFailureApp < Devise::FailureApp
  def respond
    if request_format == :turbo_stream
      redirect
    else
      super
    end
  end

  def skip_format?
    %w(html turbo_stream */*).include? request_format.to_s
  end
end

#...

# ikuti step dibawah pada file initializers/devise.rb
Devise.setup do |config|
  ...
  # Configure the parent class to the custom controller.
  config.parent_controller = 'TurboDeviseUserController'
  config.navigational_formats = ['*/*', :html, :turbo_stream]


  # Warden configuration
  config.warden do |manager|
    manager.failure_app = TurboFailureApp
  end
  #...

buat controller untuk pages

rails generate controller pages home

ubah home html pada views pages

<h1>Pages#home</h1>
<p>Find me in app/views/pages/home.html.erb</p>

<% if current_user %>
  <p>Hi, welcome <%= current_user.email %> </p>
  <p>You are a <span class="fw-bold"><%= current_user.role %></span></p>
  <% if current_user.admin? %>
    Thera are <%= User.count %> users in this system.
  <% end %>
  <p>You have successfully authenticated with your Devise account. You are now ready to interact with this app</p>
  <%= link_to 'articles', articles_path %> <br/>
  <%= link_to 'sign out', destroy_user_session_path, 'data-turbo-method': :delete %>
<% else %>
  <p>You're not sign in, please sign in or sign up if you doesn't have an account!</p>
  <%= link_to 'sign up', new_user_registration_path %>
  <%= link_to 'sign in', new_user_session_path %>
<% end %>

cek routes.rb

Rails.application.routes.draw do
devise_for :users

root 'pages#home'
end

Kesimpulan

Devise merupakan package yang sering digunakan untuk sistem autentikasi pada Ruby on Rails, namun di Rails 7 kita harus melakukan sedikit konfigurasi tambahan. Dengan mengimplementasikan konfigurasi tambahan yang sudah dituliskan diatas, maka kita akan bisa menggunakan devise sebagaimana mestinya.

Sekian, Terima kasih!