Rails 标记
Rails 标记(tags)有两种变体,你可以将它们放入 Rails HTML “嵌入式 Ruby”(ERb)模板文件中。到目前为止我们使用的那些在开头包含一个等号,<%=
。
这些标记使 Rails 不仅可以计算 Ruby 表达式,还可以在网页中显示结果。如果在开始分隔符 <%
中省略等号,则将执行代码,但不会显示结果。
<%=
和 %>
。Rails 在 Web 浏览器中显示最终页面之前处理这些文件,执行嵌入式R uby 代码并构造 HTML 页面。如果你愿意,你可以在 <%
和 %>
标记之间放置相当长的代码 - 甚至整个 Ruby 程序!然后在要在网页中显示内容时使用 <%=
和 %>
。实际上,我们可以通过完全省略控制器并将所有内容放入视图来重写我们的应用程序。通过编辑 app/views/say_hello/index.html.erb 以匹配以下内容(或复制并粘贴 embed_ruby.html.erb 文件中的代码)来尝试:
<% def showFamily( aClass, msg )
if (aClass != nil) then
msg += "<li>#{aClass}</li>"
showFamily( aClass.superclass, msg )
else
return msg
end
end %>
<%= "<ul>#{showFamily( self.class, "" )}</ul>" %>
在这种特殊情况下,网页上显示的文本与之前略有不同,因为它现在显示视图类的类层次结构,而不是控制器类的类层次结构。正如你将看到的,视图继承自 ActionView::Base
类。
你还可以通过在 <%
和 %>
标记之间放置单独的行来分割连续的代码块,而不是将整个块放在一对标记之间。这样做的好处是它允许你将标准 HTML 标记放在单独分隔的 Ruby 代码行之外。例如,你可以将其放入视图中:
<% arr = ['h','e','l','l','o',' ','w','o','r','l','d'] %>
<% # sort descending from upper value down to nil
reverse_sorted_arr = arr.sort{
|a,b|
b.to_s <=> a.to_s
} %>
<% i = 1 %>
<ul>
<% reverse_sorted_arr.each{ |item| %>
<li><%= "Item [#{i}] = #{item}" %></li>
<% i += 1 %>
<% } %>
</ul>
在这里,我为一组标签之间的变量 arr
分配了一组字符;我已经编写了一个块来对数组进行反向排序,并将结果分配给第二组标记之间的另一个变量;然后我给变量 i
分配了 1;最后我写完了这个方法:
但是,我没有将方法包含在一组标记之间,而是将每个单独的行包含在它自己的标记对中。我为什么要这样做?嗯,有两个原因。首先,我希望块中间的字符串显示在网页上,所以我需要在那里使用 <%=
标记:
<%= "Item [#{i}] = #{item}" %>
其次,我希望整个字符串集显示为 HTML 列表。所以我在 Ruby 代码块之前和之后放置了 <ul>
和 </ul>
标记;并且,我已经在 <li>
和 </li>
标记中放置了显示每个数组项的代码行。请注意,这些标记位于 Ruby 代码块中,但在此特定行上的嵌入式Ruby标记之外:
<li><%= "Item [#{i}] = #{item}" %></li>
因此,通过将一个连续的 Ruby 代码块划分为单独分隔的行,我已经掌握了能够将 HTML 混合到 Ruby 代码中的有用技巧!说实话,我根本没有把它混合在一起 - Ruby 代码仍然在标签内部闭合;我所做的是告诉 Rails 在 Web 浏览器中显示页面之前在特定点混合使用 HTML。
顺便提一下,你可能会发现将所有嵌入式 Ruby 代码放入视图(index.html.erb)的应用程序的版本与将代码全部放入控制器的先前的版本(say_hello_controller.rb)进行比较会很有趣。并且只有很少的嵌入式 Ruby(几个变量)代码被放入视图中:
<%= @heading %>
<%= @class_hierarchy %>
你可能会赞成第一个版本,其中代码和格式保持独立,是整洁的。总的来说,Ruby 代码属于 Ruby 代码文件,HTML 格式属于 HTML 文件。虽然嵌入式 Ruby 提供了一种让视图和控制器进行通信的简单方法,但通常最好保持嵌入式 Ruby 代码简洁明了,并将更复杂的 Ruby 代码放入 Ruby 代码文件中。