如果导轨中的条件未按预期工作

时间:2016-06-09 13:39:46

标签: ruby-on-rails if-statement

我的代码如下

<% 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语句。如果我混合<%= ... %><% .. %>,我的代码看起来不会很好(因为我需要执行每个块)。请帮帮我。

4 个答案:

答案 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括号。