Html 如何在HAML中使用局部变量的默认值?

Html 如何在HAML中使用局部变量的默认值?,html,ruby,forms,haml,default-value,Html,Ruby,Forms,Haml,Default Value,我有一个HAML模板,我想呈现它,并且可以选择向它提供一个局部变量,这里称为post,这样它要么使用提供的变量作为元素属性的值,要么返回到显式默认值 下面的代码显示了我的意思,但是如果没有提供post,它将无法运行。有没有干净的解决办法?我有很多这样的字段,我不想用-if defined?语句重复它们,这是我能想到的唯一其他选择 %label Post title %input{:name => "title", :value => (defined? p

我有一个HAML模板,我想呈现它,并且可以选择向它提供一个局部变量,这里称为post,这样它要么使用提供的变量作为元素属性的值,要么返回到显式默认值

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

%label
  Post title
  %input{:name  => "title",
         :value => (defined? post) ? post.title : ""} }
尝试这样做:

%input{:name => "title", :value => post ? post.title : ""}
您不需要检查defined,因为在Ruby解释器中
nil
被视为false。这段摘录最能说明这一点:

在Ruby中,只有
false
nil
被视为
false
。Ruby将其他一切——我是说一切——都视为
true

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

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

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

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

%input{:name  => "title", :value => post.try(:title) } }
当post为nil时,它只返回nil;否则返回post.title


然而,如果你想提供明确的默认值,那么你应该编写一个帮助程序(比如
default\u if nil
),或者使用猴子补丁
尝试使用
方法来指定默认值。

啊,事实证明真正的问题是这是在Sinatra,它定义了一个
post
方法来定义HTTP post的处理程序,HAML呈现程序可以看到这一点

如果向渲染器提供了
post
变量,则该变量会隐藏该变量,因此模板工作正常,但在其他情况下
post
实际上是一个函数,因此
已定义?
为真,但显然没有
title
属性


只要更改变量的名称,一切都会如我所期望的那样工作。

在带有可选变量的erb部分中,我通常只说
post | |=nil
。然后,您可以执行条件逻辑,而不会遇到未定义的变量异常。仅供参考,这在sinatra应用程序中不起作用,因为它是一种添加到
Rails
类中的方法。该方法在Ruby或Sinatra中不存在。更多细节请参见我答案的底部。很高兴你能找到答案。我应该考虑一下。