Как проверить, существует ли переменная в eex?

Я работаю над грубой частью модели, к которой я добавил поддержку изображений. В идеале я хотел бы показать изображение, если вы редактируете модель, что я бы сделал так.

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

Проблема в том, что переменная компании доступна только в действии редактирования, так как в новом действии еще есть компания, поэтому мне нужно проверить, установлена ​​ли @company.

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

Проблема в том, что это приводит к следующей ошибке.

"назначить @company недоступно в шаблоне eex. Доступные назначения: [:action, :changeset]"

Я пробовал с is_nil, но та же ошибка.


person MartinElvar    schedule 05.09.2015    source источник


Ответы (2)


EDIT До Phoenix 0.14.0 @company возвращал nil, если он не был установлен. Он был изменен на повышение, чтобы присваивание было явным (явное вместо неявного).


Если вы используете @company или assigns.company, возникнет ошибка. Однако, если вы используете assigns[:company], он вернет nil, если значение не установлено.

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

Стоит отметить, что если вы используете вложенный шаблон, вам также нужно будет передать это:

<h1>New thing</h1>
<%= render "form.html", changeset: @changeset,
                        action: thing_path(@conn, :create),
                        company: assigns[:company] %>
person Gazler    schedule 05.09.2015
comment
В идеале, однако, передать переменную компании. Даже если она будет равна нулю. Это позволит избежать множества косвенных действий. - person José Valim; 05.09.2015
comment
@JoséValim Это хороший момент - я собираюсь добавить примечание к ответу. - person Gazler; 05.09.2015

Выбранный ответ не работает.

Попробуйте с этим:

<%= if Map.has_key?(assigns, :company) do %>
  <%= Logo.url({@company.logo, @company}, :thumb) %>
<% end %>
person kiru    schedule 20.04.2020
comment
Выбранный ответ работает, как и ожидалось, в Phoenix 1.4.16. Если установлено company, содержимое выводится; если он не установлен, содержимое не выводится без ошибок. - person David Oliver; 20.04.2020
comment
На самом деле это не работает в шаблонах LiveView. - person kiru; 23.04.2020