How do i check if a variable exist, in eex?

MartinElvar picture MartinElvar · Sep 5, 2015 · Viewed 9.5k times · Source

I'm working on the crud part of a model, to which i've added image support to. Ideally i would like to show the image if you are editing a model, which i would do like this.

<%= Logo.url({@company.logo, @company}, :thumb) %>

The problem is that the company variable is only available in the edit action, as there are yet a company on the new action, so i need to check if the @company is set.

<%= unless @company do %>
  <%= Logo.url({@company.logo, @company}, :thumb) %>
<% end %>

The problem is that this yields the following error.

"assign @company not available in eex template. Available assigns: [:action, :changeset]"

I tried with is_nil, but same error.

Answer

Gazler picture Gazler · Sep 5, 2015

EDIT Prior to Phoenix 0.14.0 @company would return nil if it was not set. It was changed to raise so that the assignment would be explicit (explicit over implicit.)


If you use either @company or assigns.company then an error will be raised. However if you use assigns[:company] then it will return nil if the value is not set.

<%= if assigns[:company] do %>
  <%= Logo.url({@company.logo, @company}, :thumb) %>
<% end %>

It is worth noting that if you are using a nested template then you will need to pass this through too:

<h1>New thing</h1>
<%= render "form.html", changeset: @changeset,
                        action: thing_path(@conn, :create),
                        company: assigns[:company] %>