Условно добавьте класс для ссылки в 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