Rails · · Sampo Kuokkanen

新しいRails 8アプリ作成したら、Devise対応のナビゲーションバー追加しよう!

ナビゲーション追加しよう!

ナビゲーションバーを追加したいですが、ナビバーのテストってどうやってやるのかっていうと、ほとんどの場合はやってないんじゃないかと思います。やっててもテストが遅いのではないでしょうか。

なので、今回はテスト先に書きたいので、ViewComponentを導入したいです。

gem 'view_component'

とGemfileに追加しましょう。 あとRSpecの準備をしたら、テスト書き始められます。

# spec/rails_helper.rb
require "view_component/test_helpers"
require "capybara/rspec"

RSpec.configure do |config|
  config.include ViewComponent::TestHelpers, type: :component
  config.include Capybara::RSpecMatchers, type: :component
end

これでRSpecでテストできるようになりました。

bin/rails generate component Navbar

ファイル作成はこちらのコマンドでできます。

できたテストファイルに以下追加しましょう。

it "renders sign up if not logged in" do
  expect(
    render_inline(described_class.new).to_html
  ).to include(
    "Sign up!"
  )
end

これでちゃんと登録と表示されるかどうかテストします。 ただテスト実行したら失敗します。

とりあえずTailwind対応のナビバーを探しましょう。Tailwind PlusやHeadless UIあたりに 良いサンプルがあります。好きなの選んで、コピーして、コンポーネントに入れましょう。

Deviseを入れていれば、user_signed_in?current_userというヘルパーが使えます。

<% if user_signed_in? %>
  ...
<% else %>
  <a href="#" class="block px-4 py-2 text-sm text-gray-700">Sign in!</a>
<% end %>

これでテストも通ります! ただしリンクは押しても遷移しないので、それ用のテストを追加しましょう。

it 'renders a link to sign up page if not logged in' do
  expect(
    render_inline(described_class.new).to_html
  ).to include(
    "href=\"/users/sign_up\""
  )
end

これでテストが失敗するはずです。 コンポーネントのHTMLを以下のように修正しましょう。

<% if user_signed_in? %>
  ...
<% else %>
  <%= link_to "Sign up!", new_user_registration_path, class: "block px-4 py-2 text-sm text-gray-700" %>
<% end %>

これでちゃんとユーザー登録できるようになりました。 あとはレイアウトにこのコンポーネントを追加するだけですね。

<%= render NavbarComponent.new %>

app/views/layouts/application.html.erbに追加したら完成です! (細かいリンク追加などは残ってますが、割と自信持てるかと思います!)