2020-04-25
ERBで'<%='の前にある空白文字を取り除くシンプルな方法は用意されていない...のか?
基本形
> ERB.new("<%= :hoge %>").result # => "hoge"
> ERB.new(" <%= :hoge %> \n").result # => " hoge \n"
後ろを消したい
リファレンスによれば、trim_mode を”-“にした場合、「行末が-%>
のとき改行を出力しない」。
> ERB.new("<%= :hoge %>\n", trim_mode: '-').result # => "hoge\n"
> ERB.new("<%= :hoge -%>\n", trim_mode: '-').result # => "hoge"
しかし、-%>
が行末にない場合は後続のスペースも改行も消されない。
> ERB.new("<%= :hoge -%> \n", trim_mode: '-').result # => "hoge \n"
前を消したい
リファレンスによると「行頭が<%-
のとき行頭の空白文字を削除する」
> ERB.new(" <%- nil %>hoge", trim_mode: '-').result # => "hoge"
<%=
の前にある空白文字って消せないのかな?
<%=-
, <%-=
のように組み合わせてもダメ。
> ERB.new(" <%=- :hoge %>", trim_mode: '-').result
# => NoMethodError (undefined method `-@' for :hoge:Symbol)
> ERB.new(" <%-= :hoge %>", trim_mode: '-').result
# => SyntaxError ((erb):1: syntax error, unexpected '=', expecting end-of-input)
どうやら<%=
の前にある空白文字を取り除くシンプルな方法は用意されていないらしい。
[同じ疑問をもっている方](https://stackoverflow.com/questions/48985850/indentation-in-erb- templates:title)がいた。
ここで提示された解決策は以下。
> ERB.new(" <%- %><%= :hoge %>", trim_mode: '-').result # => "hoge"
強引さが否めない…。
ちなみに
Rails でメールのテンプレートを”xx.text.erb”でつくっていて、
<% @users.each do |user| %>
<%= user.name %>
<%= user.age %>
<% end %>
みたいな場合にブロック内の行頭の空白文字を消したくて方法を探してたのだけど、これってわりと一般的なニーズなのでは?
(メソッド化するとか、<%
をインデントしないとか、やりようはいくらでもあるとおもうけど。)
ruby で issue を検索したけどなさそう。
issue を立てるに値する話だったらとっくに誰かがやってる気がするので、
- 実はこの問題は解決できる
- そもそもこの問題が生じるのがおかしい(やりたいことの設定がおかしい)
のどちらかな気がするけどどうなんでしょうか。