是否有一种在Ruby中有条件地添加属性的内联方式?

时间:2014-05-23 15:06:21

标签: html ruby-on-rails ruby

当我希望能够仅在属性具有特定值的情况下向添加属性时,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运算符的东西让我在那里......?

5 个答案:

答案 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?)

不是每个人都喜欢帮助者,但他们为我工作。