Условно добавьте класс для ссылки в Rails

Я хочу условно добавить класс " hidden "в тег Rails link, в зависимости от того,"accepted == true".

если бы я не использовал rails 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 ответов


Вы можете сделать это за пределами link_to:

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

Если вы используете интерполяцию с # {}, все, что вы помещаете между ним, запускается как простой старый код Ruby. В этом примере вы можете добавить условный класс в строку следующим образом:

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

просто обратите внимание, что вы должны использовать одинарные кавычки вокруг имени класса 'скрытый'. Также обратите внимание, что когда переменная представляет логическое значение (true или false), вам не нужно явно говорить if accepted == true. Вы можете просто сказать if accepted.


вы также можете использовать помощника для создания ссылки:

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

я опубликовал аналогичный ответ на этот вопрос.

более чистое решение

стандартный подход требует ввода логики в представления и использования Строковой интерполяции или перемещения вещей в отдельный помощник.

вот обновленный подход, который позволяет избежать этого:

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

class_string метод

The class_string helper принимает хэш с парами ключ / значение, состоящими из имя класса CSS струны и логические значения. Результатом метода является строка классов, в которой логическое значение оценивается как true.

Пример Использования

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

вдохновленный React

этот метод вдохновлен надстройкой под названием classNames (ранее известный как classSet) из Facebook React front-end рамки.

использование в ваших проектах Rails

в настоящее время class_names функция не существует в рельсах, но!--35-->в этой статье показывает, как добавить или реализовать его в свои проекты.


Я переопределил 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']) %>

Я только что переопределил один метод, но хороший рефакторинг должен переопределить все описанные подписи здесь: http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to