Just do IT

思うは招く

Rails で erb を slim に変換する方法

途中から erb を slim に変換する方法

最初は erb で開発してたけど、「やっぱりslim にしたい!」てなったとき。

Gemfileに以下を追記。

gem "slim-rails"
gem "html2slim"

html2slimはerbをslimに変換してくれるgem。

そして

bundle

(bundle installと同じ意味)

既存のERBファイルを変換する。

# erbからslimへ変換
bundle exec erb2slim app/views/ --delete

これでview以下のerbファイルがslimに変わる。

deviseを使っていてログイン画面でエラーが出る場合

deviseを使っていて、以下のようなエラーが出る場合。

f:id:K_Koh:20200227122340j:plain

以下エラーメッセージ。

ActionView::SyntaxErrorInTemplate in Users::RegistrationsController#edit
Encountered a syntax error while rendering template: check - if resource.errors.any? #error_explanation h2 = I18n.t("errors.messages.not_saved", - count: resource.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 ')'

実際のファイルを見てみる。

app/views/devise/shared/_error_messages.html.slim

- if resource.errors.any?
  #error_explanation
    h2
      = I18n.t("errors.messages.not_saved",
      -                  count: resource.errors.count,
      -                  resource: resource.class.model_name.human.downcase)
    ul
      - resource.errors.full_messages.each do |message|
        li
          = message

このエラーは、「I18n.t("errors.messages.not_saved",のあと、改行して-をつけてるけど、そんな書き方はできないよ」と言ってくれている。

よって、以下のように修正する。

- if resource.errors.any?
  #error_explanation
    h2
      = I18n.t("errors.messages.not_saved",
        count: resource.errors.count,
        resource: resource.class.model_name.human.downcase)
    ul
      - resource.errors.full_messages.each do |message|
        li
          = message

これで解決するはず。

slimを読み込まない場合

単純に、gemをインストールしたのにサーバーを再起動してない可能性も。

bin/rails s

rails new したときから slim を使いたい場合

rails newの後に以下を追記して、bundleする。これで view ファイルを作る時は slim で生成される。

gem 'slim-rails'

参考