Подтвердить что ты не робот

Rails: настраиваемая оболочка для кнопки отправки в simple_form?

Я использую жемчужину simple_form с бутстрапом 3. Я хочу иметь обертку для кнопки отправки

Теперь он показывает HTML как

<form id="new_order" ...>
    ...

   <input class="btn btn-primary" type="submit" value="Save" name="commit">
</form>

Я хочу написать оболочку, чтобы HTML выглядел следующим образом:

<form id="new_order" ...>
  ...

  <div class="form-group">
     <div class="col-sm-offset-2 col-sm-10">
        <input class="btn btn-primary" type="submit" value="Save" name="commit">
     </div>
 </div>

Я получил это до сих пор:

Приложение/Инициализаторы/simple_form_bootstrap.rb:

options[:wrapper] = :horizontal_form
options[:wrapper_mappings] = {
  check_boxes: :horizontal_radio_and_checkboxes,
  radio_buttons: :horizontal_radio_and_checkboxes,
  file: :horizontal_file_input,
  boolean: :horizontal_boolean,

 # what to write here??
 # submit: :horizontal_submit_button

}

и это моя оболочка:

  config.wrappers :horizontal_submit_button, tag: 'div', class: 'form-group', error_class: 'has-error' do |b|
     b.use :html5
     b.use :placeholder

     b.wrapper tag: 'div', class: 'col-sm-offset-2 col-sm-10' do |ba|
       ba.use :input
       # some coe goes here, maybe
     end
  end

Какой тип ввода использовать в wrapper_mappings для кнопки отправки? Как написать эту оболочку?

4b9b3361

Ответ 1

Я собирался сделать то же самое сегодня. Я не мог найти способ сделать это через API-интерфейс обложки, как ни странно, но по умолчанию Simple Form любит обертывать свои входы в div.form-inputs и кнопку отправки в div.form-actions. Поэтому я создал div.form-actions до @extend .col-md-offset-4, чтобы получить желаемый результат.

Надеюсь, это поможет!

Ответ 2

По-видимому, не возможно иметь оболочку для кнопок с помощью simple_form. Я хотел сделать то же самое, и решение, которое я нашел, это заменить

config.button_class = 'btn'

с

config.button_class = 'myclass1 myclass2'

в файле config/initializers/simple_form.rb. Проблема в том, что он будет по умолчанию для всех кнопок формы.

Ответ 3

Простая форма button является базовой оболочкой вокруг рельсов submit. Все, что он делает, это добавление button_class, заданное в инициализаторе простой формы, и отправка его в submit, вот что он сейчас выглядит:

https://github.com/plataformatec/simple_form/blob/master/lib/simple_form/form_builder.rb#L211

def button(type, *args, &block)
  options = args.extract_options!.dup
  options[:class] = [SimpleForm.button_class, options[:class]].compact
  args << options
  if respond_to?(:"#{type}_button")
    send(:"#{type}_button", *args, &block)
  else
    send(type, *args, &block)
  end
end

Здесь нет никакой логики для использования обертки api. Но этот оператор if позволяет вам определить свой собственный метод кнопки. Если вы используете f.button :submit в своих формах, чем помещаете это в инициализатор (или декоратор, поэтому вам не нужно перезапускать сервер при настройке):

module SimpleForm
  class FormBuilder
    def submit_button(*args, &block)
      ActionController::Base.helpers.content_tag(:div, class: 'form-actions') do
        submit(*args, &block)
      end
    end
  end
end

Вам не нужно использовать помощники content_tag, любая строка html_safe будет работать.