【问题标题】:How do i check if a variable exist, in eex?如何在 eex 中检查变量是否存在?
【发布时间】:2015-12-01 10:30:22
【问题描述】:

我正在处理模型的粗略部分,我已向其中添加了图像支持。理想情况下,如果您正在编辑模型,我想显示图像,我会这样做。

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

问题是公司变量仅在编辑操作中可用,因为新操作中还有一家公司,所以我需要检查是否设置了@company。

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

问题是这会产生以下错误。

"assign @company 在 eex 模板中不可用。可用的分配:[:action, :changeset]"

我尝试了 is_nil,但同样的错误。

【问题讨论】:

    标签: elixir phoenix-framework


    【解决方案1】:

    所选答案无效。

    试试这个:

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

    【讨论】:

    • 所选答案似乎在 Phoenix 1.4.16 中按预期工作。如果设置了company,则输出内容;如果不设置,则内容不输出,没有错误。
    • 实际上它在 LiveView 模板中似乎不起作用。
    【解决方案2】:

    EDITPhoenix 0.14.0 之前@company 如果未设置则返回nil。它被更改为 raise 以便分配是显式的(显式而不是隐式)。


    如果您使用@companyassigns.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] %>
    

    【讨论】:

    • 理想的方法是传入公司变量。即使它是零。它将避免一堆间接。
    • @JoséValim 这是一个很好的观点 - 我将在答案中添加注释。
    猜你喜欢
    • 2010-10-25
    • 2014-01-30
    • 2012-07-05
    • 2011-08-18
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 2014-09-08
    相关资源
    最近更新 更多