2011-01-08 9 views
19

Mam szablon ERB do wysyłania wiadomości e-mail.Szablon ERB usuwający linię końcową

Name: <%= @user.name %> 
<% if @user.phone.present? %> 
Phone: <%= @user.phone %> 
<% end %> 
Address: <%= @user.address %> 

Próbuję usunąć pustą linię pomiędzy Name i Address gdy Phone jest pusty.

Name: John Miller 

Address: X124 Dummy Lane, Dummy City, CA 

Oczekiwany wynik

Name: John Miller 
Address: X124 Dummy Lane, Dummy City, CA 

Próbowałem użyć <%--%> tagów (usunąć z tyłu nowej linii) bez powodzenia Zwracany wynik.

Name: <%= @user.name %> 
<%- if @user.phone.present? -%> 
Phone: <%= @user.phone %> 
<%- end -%> 
Address: <%= @user.address -%> 

Jak obejść ten problem?

PS: Jestem na szynach 2.3.8.

Uwaga 1

Teraz pracuję wokół kwestii korzystania z rubinem hackery.

Helper Metoda:

def display_fields(names, user) 
    names.collect do |name| 
    value = user.send(name) 
    "#{name}: #{value}" unless value.blank? 
    end.compact.join("\n") 
end 

Zobacz Kod

<%= display_fields(["Name", "Phone", "Address"], @user) %> 

Ale to wygląda dość przylegający do mnie. Chciałbym wiedzieć, czy ktoś był w stanie uzyskać <%--%> pracujący w szablonach widoku ERB.

Odpowiedz

5

Spróbuj tego:

Name: <%= @user.name %> 
<% unless @user.phone.blank? -%>Phone: <%= @user.phone %><% end -%> 
Address: <%= @user.address %> 

Również nie wiem, czy to będzie działać:

Name: <%= @user.name %> 
<%= "Phone: #{@user.phone}" if @user.phone.present? -%> 
Address: <%= @user.address %> 

Jeśli to nie działa albo, to powinno załatwić sprawę:

Name: <%= @user.name %><%= "\nPhone: #{@user.phone}" if @user.phone.present? %> 
Address: <%= @user.address %> 
+1

Podejście 1, 2 nie działa. Odmiana trzeciego podejścia jest obecnie tym, czego używam. Popatrz na moje zaktualizowane pytanie. Problem polega raczej na tym, dlaczego znaczniki '<%--%>' nie działają. –

4

Miałem ten sam problem,

było spowodowane spacjami afer %>

Może to pomóc

François

+0

Tak, to jeden ze sposobów na utratę linii - umieść wszystkie instrukcje erb 'if' |' unless' [...] 'end' w jednym wierszu. Czasami to robię, ale nie jest to bardzo czytelne z powodu konserwacji. –

22

Aby włączyć tryb wykończenia trzeba instancję obiektu ERB z '-' jako trzeci parametr

ERB.new(template, nil, '-') 
+0

Co dziwne, ani 1.8, ani 1.9 dokumentacja nie mówi nic o opcji "-". Jest jednak w kodzie.Czy ktoś może to wyjaśnić? 1.8: http://ruby-doc.org/stdlib-1.8.7/libdoc/erb/rdoc/ERB.html#method-c-new 1.9: http://ruby-doc.org/stdlib- 1.9.3/libdoc/erb/rdoc/ERB.html # method-c-new Źródło: http://ruby-doc.org/gems/docs/p/Pimki-1.8.200/ERB/Compiler.html# method-i-prepare_trim_mode – krukid

+2

@krukid: 2.1 mówi teraz: http://ruby-doc.org/stdlib-2.1.1/libdoc/erb/rdoc/ERB.html, ale nie jest zbyt precyzyjny co robi. Powiązane pytanie: http://stackoverflow.com/questions/3801550/what-does-mean-in-ruby-on-rails-compared-to/25613037 –

4

Według najnowszych szyn docs (http://guides.rubyonrails.org/v2.3.8/configuring.html#configuring-action-view):

ActionView :: TemplateHandlers :: ERB.erb_trim_mode udostępnia tryb przycinania używany przez ERB. Domyślnie jest to "-".

odwoływać one docs ERB (http://www.ruby-doc.org/stdlib-2.0.0/libdoc/erb/rdoc/ERB.html#method-c-new)

If trim_mode is passed a String containing one or more of the following modifiers, ERB will adjust its code generation as listed: 
% enables Ruby code processing for lines beginning with % 
<> omit newline for lines starting with <% and ending in %> 
> omit newline for lines ending in %> 
- omit blank lines ending in -%> 

Więc jeśli musisz zrobić, to mieć kreskę w swoim tagu zamykającego erb jak -%>. Konieczne może być odtworzenie trybu przycinania w przypadku nieoczekiwanych wyników.

3

za pomocą opcji „>”, można pominąć nowej linii dla linii kończących się w%>

ERB.new(template, nil, '>') 

Oznacza to, że można owinąć kod Ruby wewnątrz <%%> tagów, jak zwykle. Niestety, nie znalazłem sposobu na usunięcie spacji przed uruchomieniem tagu <%.

8

Musiałem połączyć odpowiedzi przez willmcneilly, RobinBrouwer i fbo.

włączyć tryb TRIM

ERB.new(File.read(filename), nil, '-') 

Przejdź do -%>

<% $things.each do |thing| -%> 
    <object name="<%= thing.name %>"> 
    <type><%= thing.name %></type> 
    </object> 
<% end -%> 

i wreszcie przekonwertować z DOS do systemu UNIX. Użyłem następujących w Vim:

:set fileformat=unix 
:w