Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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 %>
like image 320
Robert Avatar asked Sep 12 '12 18:09

Robert


People also ask

Does Ruby have else if?

Notice Ruby uses elsif, not else if nor elif. Executes code if the conditional is true. If the conditional is not true, code specified in the else clause is executed.


1 Answers

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!

like image 152
Xavier Holt Avatar answered Oct 07 '22 17:10

Xavier Holt