Как добавить класс в форму в ruby на рельсах без установки/переопределения существующего класса помощников по умолчанию?
Добавление класса для form_for
через опцию html: {class: "form-horizontal"}
переопределяет класс по умолчанию new_model
или edit_model
. Как добавить класс, сохраняя существующий класс form_helper?
Я хочу:
<form class="edit_model form-horizontal">
или
<form class="new_model form-horizontal">
Вместо:
<form class="form-horizontal">
Ответы
Ответ 1
Я столкнулся с одной и той же проблемой. В конце концов, я придумал это решение
form_for @foo, :html => {:class => "form-horizontal #{controller.action_name}_model_name"}
Возможно, слишком поздно для вас это очень полезно, но, возможно, кому-то это будет полезно.
Ответ 2
Определение классов с помощью параметра :html => {:class=> '...'}
заменяет все классы, добавленные компоновщиком по умолчанию. Однако вы можете добавлять CSS-классы в блок, не переопределяя эти классы.
С помощником form_for
:class
будет строкой, если не установлено иное. Обратите внимание на начальный пробел при добавлении. (Обновление: также обратите внимание, что строка будет заморожена в последних версиях Rails, поэтому вместо <<
необходимо использовать +=
чтобы избежать ошибки "невозможно изменить замороженную строку".)
<%= form_for @model do |f| %>
<% f.options[:html][:class] += ' form-horizontal' %>
<%# ... %>
<% end %>
<form class="edit_model form-horizontal">
Если вы используете хелпер simple_form_for
, options[:html][:class]
будет массивом, и вам не потребуется дополнительное начальное пространство (хотя это не помешает).
<%= simple_form_for @model do |f| %>
<% f.options[:html][:class] << 'form-horizontal' %>
<%# ... %>
<% end %>
<form class="simple_form edit_model form-horizontal">
Если вы используете символ вместо модели, form_for
не будет устанавливать класс, а options[:html][:class]
будут nil
в блоке. Но если вы делаете это, у вас нет модели, которая была бы новой или сохранялась в любом случае.
<%= form_for :model do |f| %>
<% f.options[:html][:class] << ' form-horizontal' %>
<%# ... %>
<% end %>
NoMethodError: undefined method '<<' for nil:NilClass
Ответ 3
Может быть, это не идеальное решение, но считаете ли вы его выполнение с JS/Jquery?
Например:
$(document).ready(function(){
$('form.edit_model').addClass('form-horizontal')
});
Ответ 4
html: {class: "edit_model form-horizontal"}
Ответ 5
Вы пытались использовать метод слияния? [http://ruby-doc.org/core-1.9.3/Hash.html#method-i-merge] Что-то вроде html = html.merge(new) {| key, value1, value2 | value1 + "" + value2} позволит вам добавить новое значение в значение класса. [Быстрое редактирование: будьте осторожны, чтобы настроить и протестировать реализацию, чтобы вы не полностью перезаписывали html)
Ответ 6
Вы можете использовать помощник представления dom_class(object, prefix = nil)
для создания имен классов, таких как form_for
.
Это не очень чисто, делая это непосредственно в форме, но включение его в помощника может быть просто билетом. Например:
# app/helpers/application_helper.rb
def class_for object, *additional_classes
additional_classes.unshift dom_class(object, object.persisted? ? 'edit' : 'new')
end
# app/views/models/_form.html.erb
<%= form_for @model, :html => {:class => class_for(@model, 'form-horizontal')} do |f| %>
<%# ... %>
<% end %>
<form class="new_model form-horizontal" ...>