【注意!!】Railsのdeviseとviewファイルをhamlに変換する時の注意点


こんばんは
アロハな男、やすのりです!

今日はdeviseのビューファイルを修正している時に遭遇した躓きポイントについてお話していこうと思います。

ただ、前提が当てはまる人は参考にしていってね!!

前提

Railsでアプリケーション作成中にGemの
deviseを使用していて、更にhaml-rails等でhtml.erbhtml.hamlに変換している人

状況

deviseの新規登録ページのビューファイルに名前の入力欄を追加したいと思いコード修正していました。

views/users/registrations/new.html.haml
%h2 Sign up
= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f|
  = render "users/shared/error_messages", resource: resource
  .field
    = f.label :name
    %br/
    = f.text_field :name, autofocus: true
  .field
    = f.label :email
    %br/
    = f.email_field :email, autofocus: true, autocomplete: "email"
  .field
    = f.label :password
    - if @minimum_password_length
      %em
        (#{@minimum_password_length} characters minimum)
    %br/
    = f.password_field :password, autocomplete: "new-password"
  .field
    = f.label :password_confirmation
    %br/
    = f.password_field :password_confirmation, autocomplete: "new-password"
  .actions
    = f.submit "Sign up"
= render "users/shared/links"

ということで、:nameの欄を足してこれでバッチリだ!!
と、思っていたら...

...え?
何も変わってなくない??あれ???

修正するビューファイル間違えたかな?と思って確認してみても間違いなく registrations って書いてあるし...


あれ!?
なぜか、new.html.erbを参照してる!?
しかも参照先がapp/views/deviseregistrations/new.html.erbになってるぞ!?

と、思いいろいろ調べて見ると原因が見えてきました。

原因

僕のアプリケーションの構成上、deviseにUserモデルを持たせていたので、deviseのビューファイルを生成する時に$ rails g devise:views usersとコマンドを打っていたんですが、これが原因みたいです。
そもそもdeviseのモデルがUserモデル以外に無いのであれば、$ rails g devise:viewsだけで良かったみたいです。
※Userモデル以外というよりは、deviseのモデルが1つだけの時と言う方が正しいかも?

2つのコマンドの違いは?

生成されるビューファイルのディレクトリ構造が少し変わってしまいます。
具体的には$ rails g devise:views usersとコマンドを打った場合は、

app/views/users/以下にディレクトリとビューファイルが生成されます。

一方、$ rails g devise:viewsとコマンドを打った場合は

app/views/devise 以下にディレクトリとビューファイルが生成されます。

deviseディレクトリ...

これだぁぁあああ!!

はい、ということでビューファイルを生成した段階でコミットしていたので、コミット履歴を削除してコマンドを打ち直した後に、新規ビューファイルのコードを修正してみました。

すると...

よしっ!!
名前の入力欄が加わってるぞ!!

参照先もちゃんとnew.html.hamlになってる!!

結論

deviseのビューファイルを生成する時は、基本$ rails g devise:viewsでOK!!

皆さんも気をつけてね!!