Robert
Robert

Reputation: 553

Rails if else in view

My comment controller needs adjust for nesting but I'm getting a few errors. Here's what I've been trying:

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

Which gives this:

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

Any idea why this isn't working? Seems simple enough...

Here's the full view:

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

Upvotes: 9

Views: 43893

Answers (3)

davidrac
davidrac

Reputation: 10738

The problem you're describing is plain Ruby, unrelated to view. you can write something like this instead:

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

Upvotes: 3

Xavier Holt
Xavier Holt

Reputation: 14619

It's mad because the do bit starts a block, which expects an end to end it. But when the condition is true, it finds an else instead. And note that if the condition was false, it would find an end like it wants - but not the end you want! It would find the end that ends your if statement - not the end that you want to end your block.

If your semantic_form_for blocks have different contents in each case, use Paritosh's answer. But if they're the same code and you want to avoid repeating it, you can pick the arguments conditionally, and then pass them into a single semantic_form_for:

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

Hope that helps!

Upvotes: 9

Paritosh Singh
Paritosh Singh

Reputation: 6404

You should have a end for 'do'

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

It is expecting 'end' after 'do' not 'else'.

Thanks

Upvotes: 17

Related Questions