Rails视图中的if else

9

我的评论控制器需要调整嵌套,但我遇到了一些错误。这是我一直在尝试的:

<% if @commentable == @user %>
  <%= semantic_form_for [@commentable, @comment] do |f| %>
<% else %>
  <%= semantic_form_for [@user, @commentable, @comment] do |f| %>
<% end %>

这将得到如下结果:

/Users/rbirnie/rails/GoodTeacher/app/views/comments/_form.html.erb:3: syntax error, unexpected keyword_else, expecting keyword_end'); else 

您有什么想法,为什么这不起作用?看起来很简单...

以下是完整视图:

<% if @commentable == @user %>
  <%= semantic_form_for [@commentable, @comment] do |f| %>
<% else %>
  <%= semantic_form_for [@user, @commentable, @comment] do |f| %>
<% end %>

  <div class="control-group">
    <%= f.label :subject %>
    <div class="controls"><%= f.text_field :subject %></div>
  </div>
  <div class="control-group">
    <%= f.label :body %>
    <div class="controls"><%= f.text_area :body, rows: 8 %></div>
  </div>
  <div class="form-actions">
    <%= f.submit "Submit", :class => "btn-success" %>
  </div>
<% end %>

如果你可以自由选择模板处理程序,那么可以看看 Haml(http://haml.info/docs/yardoc/file.HAML_REFERENCE.html)或 Slim(http://slim-lang.com/)。这两种语言都让你不用再关注闭合块/条件语句,并且使你的模板更易读。 - jdoe
3个回答

17

你需要为 'do' 添加一个结束条件

<% if @commentable == @user %>
  <%= semantic_form_for [@commentable, @comment] do |f| %>
  <% end %>
<% else %>
  <%= semantic_form_for [@user, @commentable, @comment] do |f| %>
  <% end %>
<% end %>

它期望的是在'do'之后是'end'而不是'else'。

谢谢


1
那么,最好的解决方法是什么,可以避免需要两次使用整个form_for代码呢? - Robert
我对semantic_form_for并不是很有经验,所以无法确定,但无论如何,都会有一个迭代。 - Paritosh Singh

9
这很疯狂,因为do部分开始了一个块,需要一个end来结束它。但当条件为真时,它找到了一个else。请注意,如果条件为假,它会像期望的那样找到一个end,但不是你想要的end!它会找到结束你的if语句的end,而不是你想要结束块的end
如果你的semantic_form_for块在每种情况下都有不同的内容,请使用Paritosh的答案。但如果它们是相同的代码,并且你想避免重复,那么你可以有条件地选择参数,然后将它们传递给单个semantic_form_for
<% args = (@commentable == @user)? [@commentable, @comment] : [@user, @commentable, @comment] %>
<%= semantic_form_for(args) do |f|
    Whatever...
<% end %>

希望这能帮到您!

谢谢,这解决了问题!而且看起来比我尝试的if语句更简洁。 - Robert

3
您所描述的问题是Ruby语言本身的问题,与视图无关。您可以改为编写以下代码:
<%
if @commentable == @user
  args = [@commentable, @comment]
else
  args =  [@user, @commentable, @comment]
end
%>
<%= semantic_form_for args do |f| %>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接