我的代码如下
<% reported_type = 4 %>
<%=
if reported_type == 1
link_to "1 is true", true_path
else
link_to "1 is false", false_path
end
if reported_type == 2
link_to "2 is true", true_path
else
link_to "2 is false", false_path
end
if reported_type == 3
link_to "3 is true", true_path
else
link_to "3 is false", false_path
end
%>
预期输出:1 is false2 is false3 is false
但实际输出为3 is false
当我注释掉第三个if ... else
块时,我得到2 is false
。
如果是因为<%= ... %>
,那么必须没有呈现if语句,对吗?
由于我是Rails的新手,我无法弄清楚为什么只渲染最后一个if语句。如果我混合<%= ... %>
和<% .. %>
,我的代码看起来不会很好(因为我需要执行每个块)。请帮帮我。
答案 0 :(得分:1)
这不是你在rails中的方式。如@potashin建议的那样,将每个if
包裹在其<%=
中就足够了,但它仍然是非常单一的。这是应该如何做的:
<% if reported_type == 1 %>
<%= link_to "1 is true", true_path %>
<% else %>
<%= link_to "1 is false", false_path %>
<% end %>
我知道,很乱。这就是为什么人们喜欢使用其他模板语言,如HAML:
- if reported_type == 1
= link_to "1 is true", true_path
- else
= link_to "1 is false", false_path
回答你的直接问题
我无法弄清楚为什么只渲染最后一个if语句
这就是红宝石的作用。代码块的返回值是该块中计算的最后一个表达式。你已经观察过了。
答案 1 :(得分:0)
您应该为每个单独的<%=
提供输出if
,现在它只是呈现最后一个帮助器输出。或类似的东西:
<%(1..3).each do |x| %>
<%= (reported_type == x) ? (link_to "#{x} is true", true_path) : (link_to "#{x} is false", false_path)%>
<% end %>
答案 2 :(得分:0)
这不起作用,因为<%= ... %>
中的整个表达式都会计算到最后if-else-block
的值:
if reported_type == 3
link_to "3 is true", true_path
else
link_to "3 is false", false_path
end
要解决此问题,请使用单独的<%= ... %>
调用来包装每个if-else块。
答案 3 :(得分:0)
您在视图中使用ERB模板语言。请参阅此resource
至于您的代码,请尝试以下操作:
<% reported_type = 4 %>
<% if reported_type == 1 %>
<%= link_to "1 is true", true_path %>
<% else %>
<%= link_to "1 is false", false_path %>
<% end %>
<% if reported_type == 2 %>
<%= link_to "2 is true", true_path %>
<% else %>
<%= link_to "2 is false", false_path %>
<% end %>
...
请参阅this答案以正确使用erb括号。