Wie kann ich mehrere Zeilen von Ruby in html.erb Datei ausführen
-
29-09-2019 - |
Frage
Ich bin mit Ruby on Rails und Notwendigkeit, einen Block von Ruby-Code in einen meiner html.erb Dateien auszuführen. Tue ich es wie folgt aus:
<% def name %>
<% name = username %>
<%= name %>
oder wie folgt aus:
<% def name
name = username %>
<%= name %>
Vielen Dank für das Lesen.
Lösung
Es ist ungewöhnlich, dass ein Verfahren in einer ERB-Datei zu definieren, so dass ich davon abraten.
Wenn Sie einen Block wie #each
anrufen möchten, können Sie so etwas wie Folgendes tun:
<% names.each do |name| %>
<%= name %>
<% end %>
Vergessen Sie nicht die <% end %>
.
Andere Tipps
Wenn Sie zusätzliche Funktionen in Ihrer Ansicht benötigen, können Sie normalerweise diejenigen in einem Helfer erklären.
Für jeden Controller, wenn ein Helfer ist, wird es automatisch geladen. Zum Beispiel, wenn Sie eine People im app/helpers
Ordner haben, sollte es eine people_helper.rb
sein, und es sollte wie folgt
module PeopleHelper
def name
#do something
username
end
end
Eine weitere, sehr saubere Alternative zu verwenden, ist das Moderator Muster , aber ich denke, es ist weniger verbreitet ist (leider) .
Andernfalls, wenn Sie mehrere Zeilen von Ruby-Code in einer erb Ansicht brauchen, die ich versuchen zu vermeiden, ziehe ich die folgende Art:
<%
counter_1 = 0
counter_2 = 1
do_some_more_prep_here
%>
<% @records.each do |rec|%>
<%# do something with the prepped date in each row %>
<% end %>
Auch für mich Code Einzug ist wichtiger als HTML-Einzug, so dass ich so etwas wie
bevorzugen, werden<table>
<% @rows.each do |row| %>
<tr>
<td><%= row.item1 %></td>
<% if row.some_test %>
<td><%= row.item2 %></td>
<% end %>
</tr>
<% end %>
</table>
Aber ich bin immer sehr interessiert an unterschiedliche Meinungen in dieser Angelegenheit zu hören.
Ich kann jemand vorstellen, dass es in einer bestimmten Vorlage benötigen (kein Punkt in einen Helfer zu schaffen), um keine doppelten HTML-Markup. Das heißt, wenn resultierende HTML-Seite hat ein paar ähnlichen Blöcke von HTML-Markup. Obwohl, kann es leicht missbraucht (unlesbarer Code) wird.
<% def f1(a, b, c) %>
test: <%= a %>, <%= b %>, <%= c %>
<% end %>
<% f1(1, 2, 3) %>
<% f1(4, 5, 6) %>