Как отключить проверку javascript для части полей формы simple_form?

Использую гем simple_form. Форма была рабочая. Данные в нее заносились из базы, можно было изменить данные и сохранить на сервер. Данные в simple_form проходят двухступенчатую валидацию. Сначала javascript проверяет валидность данных. Ругается на различные поля с ошибками ввода. Если браузер считает данные верными - форма отсылается на сервер, где модель при сохранении в базу проводит еще те же самые валидации. Если что-то не верно - редиректит на редактирование формы, где подсвечивает поля, содержащие ошибки. Это я написал как я понимаю суть штатной работы simple_form (поправьте, если не так).
Теперь к проблеме. Форма разраслась до гигантских размеров. Для редактирования формы применяются табы. Т.е. часть полей всегда скрыта от пользователя. Пользователь правит одну вкладку, потом переходит к другой и т.д. Потом жмет отправить. Загвоздка заключается в том, что для скрытых ошибочных полей javascript выкидывает ошибку
An invalid form control with name='user[имя поля]' is not focusable.
Форма не отсылается, ошибка не отображается. Вот думаю как обойти проблему.
Для открытой вкладки хотелось бы сохранить javascript проверку. Остальные поля допроверились бы на сервере. Поля подсветились. Юзер получил flash об ошибке и пошел бы на другие вкладки, где бы обнаружил подсвеченные невалидные поля. Есть ли такая возможность? Или есть ли возможность полностью отключить javascript валидацию для данной конкретной формы?
Еще возможен вариант с несколькими формами, где на каждой форме содержится группа полей. Тогда как проходить на сервере часть валидаций, если пришли только часть данных для модели?
  • Вопрос задан
  • 1460 просмотров
Пригласить эксперта
Ответы на вопрос 2
@sunnmas Автор вопроса
Ruby
Решил разбить форму на части. Получилось 4 формы. Сначала не хотел действовать этим способом, т.к. не хотел чтобы в угоду интерфейса поменялась бизнес логика контроллера. Но все оказалось достаточно приемлемым. Количество маршрутов не изменилось и количество экшенов не изменилось. Это хорошо.
Старый маршрут:
get		'/настройки', :to=> 'cabinet/user#edit', :as => :edit_user

Новый маршрут:
get		'/настройки/:tab', :to=> 'cabinet/user#edit', :as => :edit_user

Логика вьюхи. Ранее она содержала все поля, доступные для редактирования, теперь в зависимости от параметра рендерит соответствующий паршиал:
%h1= @page_title = "Настройки профиля"
- if params[:tab] == "основные"
	- @tab = :common
- elsif params[:tab] == "география"
	- @tab = :geo
- elsif params[:tab] == "уведомления"
	- @tab = :notify
- elsif params[:tab] == "интерфейс"
	- @tab = :interface
- else
	- @tab = :common
= render partial: "/cabinet/settings/tabs"
= simple_form_for current_user, :url => update_user_path, :html => {:multipart => true} do |f|
	- if @tab == :common
		= render partial: "/cabinet/settings/form_common", locals: {f: f}
	- if @tab == :geo
		= render partial: "/cabinet/settings/form_geo", locals: {f: f}
	- if @tab == :notify
		= render partial: "/cabinet/settings/form_notify", locals: {f: f}
	- if @tab == :interface
		= render partial: "/cabinet/settings/form_interface", locals: {f: f}
	= f.button :submit, "Сохранить изменения"
	= hidden_field_tag :tab, params[:tab]


Все эти формы сабмитятся на один и тот же маршрут, который не изменился.
Логика экшена претерпела изменения:
Было:
def update
		bla(bla(bla))
		redirect_to edit_user_path
	end

Стало:
def update
		bla(bla(bla))
		redirect_to edit_user_path(:tab=>params[:tab])
	end

Для всех полей модели сделал валидные значения по умолчанию. Получилось, что запись User в базе при создании валидна. Поэтому логика валидаций в модели не изменилась. Как вам такое решение? Как бы сделали вы?
Ответ написан
@darvetra
Возникла подобная проблема со скрытым полем в Chrome, вылечил, добавив полю атрибут readonly
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы