2012-09-12 76 views
4

我的評論控制器需要調整嵌套,但我收到一些錯誤。這是我一直想:Rails if else in view

<% 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 %> 
+0

如果你是自由選擇的模板處理程序,看看Haml的(http://haml.info/docs/yardoc/file.HAML_REFERENCE.html)或苗條(http://slim-lang.com/)。這兩種語言都讓你有機會忘記關閉塊/ ifs並使你的模板更具可讀性。 – jdoe

回答

7

因爲do位開始一個塊,其預計的end結束它這是瘋了。但是當條件成立時,它會找到一個else。並注意,如果條件是錯誤的,它會發現它想要的end - 但不是你想要的end!它會發現end結束您的if聲明 - 而不是您想要結束阻止的end

如果您的semantic_form_for塊在每種情況下都有不同的內容,請使用Paritosh的答案。但是,如果它們是相同的代碼,並要避免重複它,你可以選擇的參數條件,然後將它們傳遞到一個單一的semantic_form_for

<% args = (@commentable == @user)? [@commentable, @comment] : [@user, @commentable, @comment] %> 
<%= semantic_form_for(args) do |f| 
    Whatever... 
<% end %> 

希望幫助!

+0

謝謝,這個修好了!它看起來比我嘗試的if語句更清潔。 – Robert

11

你應該有一個結束的「做」

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

它期待「端」後「做」而不是'其他'。

感謝

+1

那麼解決這個問題最好的方法是什麼,而不需要整個form_for代碼兩次? – Robert

+0

我對semantic_form_for的經驗並不是很多,所以不能說,但無論你做什麼,一次迭代就會在那裏。 –

3

您所描述的問題是普通的Ruby,與視圖無關。你可以寫這樣的事情,而不是:

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