Как добавить класс в форму в 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" ...>