如何在 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 中,只有
false
和nil
被视为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 中为本地人使用默认值?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SQL Server 的单个批次中为列添加默认值并使用默认值更新所有行?