如何在 HAML 中为本地人使用默认值?

Posted

技术标签:

【中文标题】如何在 HAML 中为本地人使用默认值?【英文标题】:How to use a default value for locals in HAML? 【发布时间】:2012-01-29 13:51:15 【问题描述】:

我有一个要渲染的 HAML 模板,并可选择提供一个局部变量,这里称为 post,以便它使用提供的变量作为元素属性的值,或者回退到显式默认值。

下面的代码说明了我的意思,但如果没有提供post,它将无法运行。有一个干净的解决方案吗?我有很多这样的字段,我宁愿不必用- if defined? 语句重复它们,这是我能想到的唯一其他选择。

%label
  Post title
  %input:name  => "title",
         :value => (defined? post) ? post.title : "" 

【问题讨论】:

在带有可选变量的 erb 部分中,我通常只说 post ||= nil。然后您可以执行条件逻辑,而不会遇到未定义的变量异常。 【参考方案1】:

试试这个:

%input:name => "title", :value => post ? post.title : ""

您不需要检查已定义,因为 nil 在 Ruby 解释器中被视为 false。 Eloquent Ruby by Russ Olsen 的这段摘录描述得最好:

在 Ruby 中,只有 falsenil 被视为 false。 Ruby 将其他所有内容都视为 true

如果这是一个 Rails 应用程序,一个更有说服力的解决方案是使用 Rails try 方法:

%input:name => "title", :value => post.try(:title)

try 方法调用由传入类的符号标识的方法,除非类本身是 nil,在这种情况下,它将返回 nil(haml 将自动转换为空白字符串) . Read more about the rails try method here.

【讨论】:

【参考方案2】:

如果你只是想处理某个变量为 nil 的情况,你可以使用try 方法。例如:

%input:name  => "title", :value => post.try(:title)  

当 post 为 nil 时,它只返回 nil;否则返回 post.title。

然而,如果您想提供明确的默认值,那么您应该编写一个帮助程序(类似于default_if_nil)或猴子修补try 方法以使其能够指定默认值。

【讨论】:

仅供参考,这在 sinatra 应用程序中不起作用,因为它是一种添加到 Rails 类的方法。该方法在 Ruby 或 Sinatra 中不存在。有关详细信息,请参阅我的答案底部。【参考方案3】:

啊,原来真正的问题是,这是在 Sinatra 中,它定义了一个 post 方法来定义 HTTP 帖子的处理程序,而 HAML 渲染器可以看到这一点。

如果您向渲染器提供了post 变量,它会隐藏它,因此模板可以正常工作,但否则post 实际上是一个函数,因此defined? 是正确的,但显然没有title 属性.

只需更改变量的名称,一切都会按我的预期工作。

【讨论】:

很高兴你知道了。我应该想到的。

以上是关于如何在 HAML 中为本地人使用默认值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Haml 中编写 if 条件?

如何在 SQL Server 的单个批次中为列添加默认值并使用默认值更新所有行?

如何在 Postgres 中为 UUID 主键列设置默认值?

如何在表单输入字段中为密码分配默认值?

如何在 django 中为分组选项设置默认值

如何在 django 中为分组选项设置默认值