概要
devise のビューファイルを gem 'erb2slim' で erb → slim に変換した時に躓いた内容についてまとめる。
前提
- 以下は開発環境に導入済みであること
- devise
- slim
- erb2slim
発生したエラー
$ bundle exec erb2slim app/views/devise app/views/devise
実行後にアプリを開いて問題ないか確認
$ rails s
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 タグ内の '-' を削除
- 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
- 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)
$ git add .
$ git commit -m "Backup devise view files"
b : ディレクトリ(app/views/devise)を丸ごとコピー
username:~/environment/app-name
$ cp -r app/views/devise app/views/backup-devise-view
2 : erb2slim を実行
$ bundle exec erb2slim app/views/devise app/views/devise -d
-d オプションによって変換元のerbファイルは削除されるが、 1でバックアップを取れていれば戻せる。
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
うまくいかなくて元に戻したいとき
"実行コマンド・発生したエラー内容" 1 でとった方法により実行する内容が異なる
- 1-a の場合 (git)
$ git checkout . #変更した内容を取消
$ git ls-files -z -o --exclude-standard | xargs -0 rm -rf #untracked の 追加ファイル・ディレクトリ を削除
二行目は難しいコマンドなのですが、以下のURLを参考にさせていただきました。
Git: untrackedの追加ファイルやディレクトリを「安全に」削除する方法|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社
- 1-b の場合
変換済みのslimファイルが入ったディレクトリを削除
↓
バックアップしたディレクトリをリネームする
$ rm -rf -i app/views/devise
$ mv app/views/backup-devise-view app/views/devise