有条件地在Rails中为link_to添加一个类

时间:2014-03-13 19:34:29

标签: ruby-on-rails ruby-on-rails-4

我想有条件地将类“hidden”添加到Rails链接标记中,具体取决于“accepted == true”。

如果我没有使用导轨link_to我可以<a href="#" class="foo bar <%= "hidden" if accepted == true %>" >。如何在link_to内完成此操作?

<%= link_to "Accept Friend Request", 
    "#", 
    class: "btn btn-success btn-sm btn-block requestSent ???hidden???",
    disabled: true %>

5 个答案:

答案 0 :(得分:23)

如果对#{}使用插值,则在它之间放置的任何内容都将作为普通的旧Ruby代码运行。 在此示例中,您可以在字符串中添加条件类,如下所示:

<%= link_to "Accept Friend Request", 
    "#", 
    class: "btn btn-success btn-sm btn-block requestSent #{'hidden' if accepted}",
    disabled: true %>

请注意,您应该在类名“hidden”周围使用单引号。 另请注意,当变量表示布尔值(true或false)时,您无需明确说出if accepted == true。您可以简单地说if accepted

答案 1 :(得分:15)

您可以在link_to

之外进行
<% css_class = accepted ? "hidden" : "" %>
<%= link_to "Accept Friend Request", 
  "#", 
  class: "btn btn-success btn-sm btn-block requestSent #{css_class}",
  disabled: true %>

答案 2 :(得分:4)

您也可以使用助手来建立链接:

def accept_friend_request_link
  classes = [:btn, :and_friends]
  if accepted
    classes << :hidden
  end
  link_to 'Accept Friend Request', '#', class: classes, disabled: true
end

答案 3 :(得分:0)

我发布了this question的类似答案。

更清洁的解决方案

标准方法需要将逻辑放入视图中并使用字符串插值或将事物移动到单独的帮助器中。

这是一种更新的方法,可以避免任何这种情况:

<%= link_to "Accept Friend Request", 
    "#", 
    class: class_string("btn btn-success btn-sm ban-block requestSent" => true, hidden: accepted),
    disabled: true %>

class_string方法

class_string助手采用包含 CSS类名字符串布尔值的键/值对的哈希值。该方法的结果是一串类,其中布尔值计算为true。

样本用法

class_names("foo bar" => true, baz: false, buzz: some_truthy_variable)
# => "foo bar baz"

受React启发

这项技术的灵感来自于Facebook classNames前端框架中名为classSet(以前称为React)的附加组件。

在您的Rails项目中使用

截至目前,Rails中不存在class_names函数,但this article向您展示了如何在项目中添加或实现它。

答案 4 :(得分:0)

我已覆盖link_to以期待def link_to(options = {}, html_options = {}) if html_options.is_a?(Hash) && html_options.key?(:class_if) html_options[:class] << (" #{html_options[:class_if][1].strip}") if html_options[:class_if][0] html_options.delete :class_if end super(options, html_options) end 参数,请查看:

<%= link_to(my_path, class: "class1", class_if: [true_or_false?, 'class2']) %>

用法:

c(rep(1, 4), rep(2,3), rep(3, 2), 4)

我只是覆盖了一个方法,但一个好的重构就是覆盖所有描述的签名:http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to