Решил разбить форму на части. Получилось 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 в базе при создании валидна. Поэтому логика валидаций в модели не изменилась. Как вам такое решение? Как бы сделали вы?