Class html.erb 文件中的名称分隔
Class name in html.erb file separated
我在循环中有一个 if
语句,用于将变量(名为 var_class)更改为 class 名称。我怎样才能使它成为连续的字符串?
代码如下:
<% j = 0%>
<% @question.each do |index| %>
<% var_class = ""%>
<% j == 0 ? var_class = "tab-pane fade active show" : var_class = "tab-pane fade" %>
<div class=<%=var_class %> style='height: 444px; overflow-y: auto;' id=<%="question#{j+=1}"%>>
但是当我在 chrome 检查中查看 html 时,它不是作为连续字符串包含在内,而是在有 space 时被分隔开。像这样:
class= "tab-pane" fade active show
但我希望它是
class = "tab-pane fade active show"
我试过 <div class=<%=#{var_class} %>
和 <div class=<%="var_class" %>
以及它们的派生词。有人可以帮忙吗?
我认为您遗漏了 class 和 id 属性的引号。
<div class='<%=var_class %>' style='height: 444px; overflow-y: auto;' id='<%="question#{j+=1}"%>'>
Messias 的回答是它的基础。如果字符串周围没有引号,DOM 会在遇到 space 时停止 classes。它认为其他项目是 div
标签上的属性。
以最佳实践的方式,我们通常希望避免在 rails 视图中进行局部赋值(在其中设置变量)。这真的很想成为一个帮助者或装饰者(如果你真的需要那个级别的功能和可测试性)。
[以下是我没有测试过的伪代码,所以可能会有一些小错误]
在您的 ERB 视图中:
<% @questions.each do |index| %>
<div class="<%= classy(index) %>" id="[TBD see below]">
<% end %>
如果可能的话,我建议找一个比 div
更语义化的 HTML 标签。迭代器 (.each) 往往是一个对象列表,因此内部包含 LI 的 UL(无序列表)或 OL(有序列表)可能是更好的选择。默认情况下,UL 为您提供按钮,OL 为您提供编号,但这些可以更改。
您可能还想避免在 ID 名称中使用 # 符号,因为您会在 css 文件中使用 #name 调用 ID。所以#name#2 可能会在 DOM 中给你一些意想不到的混乱结果。您可能希望使用 each_ with _index
来获取数组和索引值。很好地解释了这里的差异:What is the "right" way to iterate through an array in Ruby?
<ul class="questions">
<% @questions.each_with_index do |question,index| %>
<li class="<%= classy(question, index) %>" id="question_<%= index %>">
[CONTENT]
</li>
<% end %>
</ul>
whatever_helper.rb 中的辅助方法(匹配 class 名称或应用程序,如果站点范围广):
def classy(question, index)
if index == 0
"tab-pane fade active show"
else
"tab-pane fade"
end
end
在我们进行此操作的同时,让我们从视图中获取演示文稿标记。在您的 CSS 文件中:
.tab-pane.fade {
height: 444px;
overflow-y: auto;
}
如果您想要实现不同的目标,请告诉我们。这是我根据阅读问题和代码得出的最佳猜测。
在 Ruby 中,您可以使用 Enumerable#each_with_index
循环访问具有索引的集合:
<% @question.each_with_index do |value, index| %>
<% end %>
<% end %>
一般来说,在 Ruby 中,如果您使用 .each
或任何带有外部变异变量的迭代器,那您就错了。
您还可以使用 content_tag
:
清理视图
<% @question.each_with_index do |value, index| %>
<%
classes = ["tab-pane", "fade"]
classes = classes + ["active", "show"] if index == 0
%>
<%= content_tag :div, class: classes, id: "question#{index+1}" do %>
<% end %>
<% end %>
如果您只是加入 类:
的数组,则可以将相同的方法用于直接 ERB 插值
<div class="<%= classes.join(" ")%>" ...
我在循环中有一个 if
语句,用于将变量(名为 var_class)更改为 class 名称。我怎样才能使它成为连续的字符串?
代码如下:
<% j = 0%>
<% @question.each do |index| %>
<% var_class = ""%>
<% j == 0 ? var_class = "tab-pane fade active show" : var_class = "tab-pane fade" %>
<div class=<%=var_class %> style='height: 444px; overflow-y: auto;' id=<%="question#{j+=1}"%>>
但是当我在 chrome 检查中查看 html 时,它不是作为连续字符串包含在内,而是在有 space 时被分隔开。像这样:
class= "tab-pane" fade active show
但我希望它是
class = "tab-pane fade active show"
我试过 <div class=<%=#{var_class} %>
和 <div class=<%="var_class" %>
以及它们的派生词。有人可以帮忙吗?
我认为您遗漏了 class 和 id 属性的引号。
<div class='<%=var_class %>' style='height: 444px; overflow-y: auto;' id='<%="question#{j+=1}"%>'>
Messias 的回答是它的基础。如果字符串周围没有引号,DOM 会在遇到 space 时停止 classes。它认为其他项目是 div
标签上的属性。
以最佳实践的方式,我们通常希望避免在 rails 视图中进行局部赋值(在其中设置变量)。这真的很想成为一个帮助者或装饰者(如果你真的需要那个级别的功能和可测试性)。
[以下是我没有测试过的伪代码,所以可能会有一些小错误]
在您的 ERB 视图中:
<% @questions.each do |index| %>
<div class="<%= classy(index) %>" id="[TBD see below]">
<% end %>
如果可能的话,我建议找一个比 div
更语义化的 HTML 标签。迭代器 (.each) 往往是一个对象列表,因此内部包含 LI 的 UL(无序列表)或 OL(有序列表)可能是更好的选择。默认情况下,UL 为您提供按钮,OL 为您提供编号,但这些可以更改。
您可能还想避免在 ID 名称中使用 # 符号,因为您会在 css 文件中使用 #name 调用 ID。所以#name#2 可能会在 DOM 中给你一些意想不到的混乱结果。您可能希望使用 each_ with _index
来获取数组和索引值。很好地解释了这里的差异:What is the "right" way to iterate through an array in Ruby?
<ul class="questions">
<% @questions.each_with_index do |question,index| %>
<li class="<%= classy(question, index) %>" id="question_<%= index %>">
[CONTENT]
</li>
<% end %>
</ul>
whatever_helper.rb 中的辅助方法(匹配 class 名称或应用程序,如果站点范围广):
def classy(question, index)
if index == 0
"tab-pane fade active show"
else
"tab-pane fade"
end
end
在我们进行此操作的同时,让我们从视图中获取演示文稿标记。在您的 CSS 文件中:
.tab-pane.fade {
height: 444px;
overflow-y: auto;
}
如果您想要实现不同的目标,请告诉我们。这是我根据阅读问题和代码得出的最佳猜测。
在 Ruby 中,您可以使用 Enumerable#each_with_index
循环访问具有索引的集合:
<% @question.each_with_index do |value, index| %>
<% end %>
<% end %>
一般来说,在 Ruby 中,如果您使用 .each
或任何带有外部变异变量的迭代器,那您就错了。
您还可以使用 content_tag
:
<% @question.each_with_index do |value, index| %>
<%
classes = ["tab-pane", "fade"]
classes = classes + ["active", "show"] if index == 0
%>
<%= content_tag :div, class: classes, id: "question#{index+1}" do %>
<% end %>
<% end %>
如果您只是加入 类:
的数组,则可以将相同的方法用于直接 ERB 插值<div class="<%= classes.join(" ")%>" ...