У меня есть помощник, который создает экземпляр модели и отображает форму. Эта форма должна быть доступна любому представлению в приложении.
# support_form_helper
def support_form
@support_stats = SupportForm::Stat.find(get_stats_id)
@enquiry = SupportForm::Enquiry.new(stats_id: @support_stats.id)
render partial: 'support_form/enquiries/form'
end
И это отображается в представлении:
# some_view.html.erb
<%= support_form %>
Это нормально, пока я не захочу отправить форму и проверить ее в контроллере.
# enquiries_controller.rb
def create
@enquiry = SupportForm::Enquiry.new(params[:support_form_enquiry])
topic = @enquiry.topic
@stat = SupportForm::Stat.find(@enquiry.stats_id)
@stat.stats[topic] = @stat.stats[topic].to_i.next
respond_to do |format|
if @enquiry.valid? && @stat.save
format.html { redirect_to(root_path) }
else
format.html { redirect_to(:back) }
end
end
end
Здесь я не могу отобразить предыдущее представление с ошибками, связанными с недопустимым объектом. Помощник вызывается снова и инициализирует новый объект @enquiries
, очевидно, без ошибок.
Как я могу отображать форму во многих представлениях в приложении и по-прежнему возвращаться к представлению с объектом вместе с ошибками, когда он недействителен?
Я нашел ответ, который отвечает на мой вопрос, но это плохая идея:
Визуализация действия, инициировавшего обновление
def create @enquiry = SupportForm::Enquiry.new(params[:support_form_enquiry])
topic = @enquiry.topic
@stat = SupportForm::Stat.find(@enquiry.stats_id)
@stat.stats[topic] = @stat.stats[topic].to_i.next
if @enquiry.valid? && @stat.save
redirect_to(root_path)
else
render Rails.application.routes.recognize_path(request.referer).values.join("/")
end
end
Проблема в том, что в представлении, которое отправило форму, скорее всего, будут переменные экземпляра, и мне нужно будет создать экземпляр всех переменных экземпляра в приложении, тогда ..... это невозможно.
В настоящее время я рассматриваю возможность размещения ошибок во флэш-хэше ... не то, что я хочу делать. С возвращенным исходным объектом я могу повторно заполнить поля пользовательским вводом.