【Rails】devise で作成されたerbファイルを slim に変換した時に発生したエラー

### 概要

devise のビューファイルを gem 'erb2slim' で erb → slim に変換した時に躓いた内容についてまとめる。

### 前提
- 以下は開発環境に導入済みであること
  - devise
  - slim
  - erb2slim

### 発生したエラー

```shell:Terminal
$ bundle exec erb2slim app/views/devise app/views/devise
```

実行後にアプリを開いて問題ないか確認

```shell:Terminal
$ rails s
```

```shell:ログイン画面にアクセス時のエラー
ActionView::SyntaxErrorInTemplate:
        Encountered a syntax error while rendering template: check - if object.errors.any?
          #error_explanation
            h2
              = I18n.t("errors.messages.not_saved",
              -                  count: object.errors.count,
              -                  resource: resource.class.model_name.human.downcase)
            ul
              - resource.errors.full_messages.each do |message|
                li
                  = message
      # ./app/views/devise/shared/_error_messages.html.slim:5: syntax error, unexpected ':', expecting ')'
      # -                  count: object.errors.count,
      #                         ^
      # ./app/views/devise/shared/_error_messages.html.slim:6: syntax error, unexpected unary-, expecting '='
      # -                  resource: r...
      # ^
      # ./app/views/devise/shared/_error_messages.html.slim:6: syntax error, unexpected ')', expecting end
      # ..._name.human.downcase)))).to_s)); 
      # ...                              ^
      # ./app/views/devise/shared/_error_messages.html.slim:5: syntax error, unexpected ':', expecting ')'
      # -                  count: object.errors.count,
      #                         ^
      # ./app/views/devise/shared/_error_messages.html.slim:6: syntax error, unexpected unary-, expecting '='
      # -                  resource: r...
      # ^
      # ./app/views/devise/shared/_error_messages.html.slim:6: syntax error, unexpected ')', expecting end
      # ..._name.human.downcase)))).to_s)); 
      # ...              
```

### 解決策

h2 タグ内の '-' を削除

```slim:app/views/devise/shared/_error_massages.html.slim(変更前)
- if object.errors.any?
  #error_explanation
    h2
      = I18n.t("errors.messages.not_saved",
      -                  count: object.errors.count,
      -                  resource: resource.class.model_name.human.downcase)
    ul
      - resource.errors.full_messages.each do |message|
        li
          = message
```

```slim:app/views/devise/shared/_error_massages.html.slim(変更後)
- if object.errors.any?
  #error_explanation
    h2
      = I18n.t("errors.messages.not_saved",
                        count: object.errors.count,
                        resource: resource.class.model_name.human.downcase)
    ul
      - resource.errors.full_messages.each do |message|
        li
          = message
```

### erb2slim 導入準備から変換後の間に行った内容
#### 1: 変換前に devise ビューファイルをバックアップ
以下 a,b どちらかでバックアップをとる。
変換で不具合が起きて断念しても後で戻せるようにするため。

##### a : git の機能を利用する方法
- この時点で commit しておく

eg)

```shell:Terminal
$ git add . 
$ git commit -m "Backup devise view files"
```

##### b : ディレクトリ(app/views/devise)を丸ごとコピー

```bash:Terminal
username:~/environment/app-name
$ cp -r app/views/devise app/views/backup-devise-view
```


#### 2 : erb2slim を実行

```shell:Terminal
$ bundle exec erb2slim app/views/devise app/views/devise -d
```

-d オプションによって変換元のerbファイルは削除されるが、 1でバックアップを取れていれば戻せる。

```shell:実行後
ActionView::SyntaxErrorInTemplate:
        Encountered a syntax error while rendering template: check - if object.errors.any?
          #error_explanation
            h2
              = I18n.t("errors.messages.not_saved",
              -                  count: object.errors.count,
              -                  resource: resource.class.model_name.human.downcase)
            ul
              - resource.errors.full_messages.each do |message|
                li
                  = message
      # ./app/views/devise/shared/_error_messages.html.slim:5: syntax error, unexpected ':', expecting ')'
      # -                  count: object.errors.count,
      #                         ^
      # ./app/views/devise/shared/_error_messages.html.slim:6: syntax error, unexpected unary-, expecting '='
      # -                  resource: r...
      # ^
      # ./app/views/devise/shared/_error_messages.html.slim:6: syntax error, unexpected ')', expecting end
      # ..._name.human.downcase)))).to_s)); 
      # ...                              ^
      # ./app/views/devise/shared/_error_messages.html.slim:5: syntax error, unexpected ':', expecting ')'
      # -                  count: object.errors.count,
      #                         ^
      # ./app/views/devise/shared/_error_messages.html.slim:6: syntax error, unexpected unary-, expecting '='
      # -                  resource: r...
      # ^
      # ./app/views/devise/shared/_error_messages.html.slim:6: syntax error, unexpected ')', expecting end
      # ..._name.human.downcase)))).to_s)); 
      # ...              
```


### 背景・原因など

- 変換後 slim の構文の誤り

> ダッシュは制御コードを意味します。...(省略)...複数行にわたる Ruby のコードが...(省略)...行末がカンマ , で終わる場合 (例 関数呼び出し) には, 行末にバックスラッシュを追加する必要はありません。[slim/README.jp.md at master · slim-template/slim](https://github.com/slim-template/slim/blob/master/README.jp.md#%E5%88%B6%E5%BE%A1%E3%82%B3%E3%83%BC%E3%83%89--)

### うまくいかなくて元に戻したいとき

"実行コマンド・発生したエラー内容" 1 でとった方法により実行する内容が異なる

- 1-a の場合 (git)

```shell:Terminal
$ git checkout . #変更した内容を取消
$ git ls-files -z -o --exclude-standard | xargs -0 rm -rf #untracked の 追加ファイル・ディレクトリ を削除
```

二行目は難しいコマンドなのですが、以下のURLを参考にさせていただきました。
[Git: untrackedの追加ファイルやディレクトリを「安全に」削除する方法｜TechRacho（テックラッチョ）〜エンジニアの「？」を「！」に〜｜BPS株式会社](https://techracho.bpsinc.jp/hachi8833/2020_01_24/87489)

- 1-b の場合

変換済みのslimファイルが入ったディレクトリを削除
↓
バックアップしたディレクトリをリネームする

```shell:Terminal
$ rm -rf -i app/views/devise
$ mv app/views/backup-devise-view app/views/devise 
```

### 参考URL

- [slim/README.jp.md at master · slim-template/slim](https://github.com/slim-template/slim/blob/master/README.jp.md#%E5%88%B6%E5%BE%A1%E3%82%B3%E3%83%BC%E3%83%89--)
- [Ruby on Rails - deviseでsignupしようとするとSyntaxErrorエラーとなる｜teratail](https://teratail.com/questions/227124)