当我希望能够仅在属性具有特定值的情况下向添加属性时,Rails中有很多次。
让我举个例子。我们想说我要根据特定属性禁用按钮,例如check_if_user_can_be_added
:
link_to 'Create account', new_user_path, disabled: (user_can_be_added?)
这一切看起来都很好,除了残疾碰巧在HTML中应用,无论你给它什么值。如果您为按钮提供属性disabled: false
,那么它仍将被禁用。
# if the button is disabled
link_to 'Create account', new_user_path, disabled: true
# if the button is not disabled
link_to 'Create account', new_user_path
获得此功能意味着您需要一个类似于以下的解决方案,首先设置选项哈希,然后再将其传递:
options = user_can_be_added? ? {disabled: true} : {}
link_to 'Create account', new_user_path, options
这不起作用,但相信Ruby的美丽,我怀疑那里有类似的东西。这基本上就是我想做的事情
link_to 'Create account', new_user_path, ({disabled: true} if user_can_be_added?)
我可以这样做,是否有一些使用splat运算符的东西让我在那里......?
答案 0 :(得分:8)
您可以设置nil以使Rails忽略该属性:
link_to 'Create account', new_user_path, disabled: (user_can_be_added? ? true : nil)
对于这种特殊情况,您也可以使用||像这样:
link_to 'Create account', new_user_path, disabled: (user_can_be_added? || nil)
答案 1 :(得分:0)
我不熟悉rails,但内联if语句可以在ruby中实现如下:
(condition ? true : false)
我认为你的代码看起来像这样:
link_to 'Create account', new_user_path, (user_can_be_added? ? disabled: true : nil)
如果nil
解析为假,则基本上会传入disable: true
代替user_can_be_added?
。
我不确定link_to
函数如何处理它。我想disabled: false
无效的原因是link_to
函数接收属性的哈希值作为最终参数,它们应用于html链接。由于html中的disabled
属性不需要值,因此无论其值如何,它都会保留在<a href="" disabled>
中。有人可以随意纠正我,但我还没有用过轨道。
答案 2 :(得分:0)
多年前,我使用了一个Rails插件来保存Github上仍然可用的HTML属性。该插件允许编写如下的html标签:
content_tag(:div, :class => { :first => true, :second => false, :third => true }) { ... }
# => <div class="first third">...
当前版本的Rails不支持插件,插件仅适用于标记帮助程序,但这可能会帮助您自己编写帮助程序。
答案 3 :(得分:0)
对于许多论点,使用splat将起作用:
p "Here's 42 or nothing:", *(42 if rand > 0.42)
但这对哈希参数不起作用,因为它会将它转换为数组。
我不推荐它,但你可以使用to_h
(Ruby 2.0 +):
link_to 'Create account', new_user_path, ({disabled: true} if user_can_be_added?).to_h
答案 4 :(得分:0)
对我来说,这看起来像是一个使用助手的好地方
module AccountHelper
def link_to_create_account disabled = false
if disabled
link_to 'Create account', new_user_path, disabled: true
else
link_to 'Create account', new_user_path
end
end
end
在您的ERB中,它只是link_to_create_account(user_can_be_added?)
不是每个人都喜欢帮助者,但他们为我工作。