Browse Source

Form with model so that we can validate (hypothetically)

pull/36/head
baarkerlounger 4 years ago
parent
commit
d368e9f5cf
  1. 13
      app/controllers/case_logs_controller.rb
  2. 6
      app/helpers/conditional_questions_helper.rb
  3. 2
      app/models/case_log.rb
  4. 11
      app/views/form/page.html.erb
  5. 3
      config/routes.rb

13
app/controllers/case_logs_controller.rb

@ -22,10 +22,11 @@ class CaseLogsController < ApplicationController
def next_page
form = Form.new(2021, 2022)
@case_log = CaseLog.find(params[:case_log_id])
previous_page = params[:previous_page]
@case_log = CaseLog.find(params[:id])
previous_page = params[:case_log][:previous_page]
questions_for_page = form.questions_for_page(previous_page).keys
answers_for_page = page_params(questions_for_page).select { |k, _v| questions_for_page.include?(k) }
begin
@case_log.update!(answers_for_page)
next_page = form.next_page(previous_page)
redirect_path = if next_page == :check_answers
@ -36,6 +37,10 @@ class CaseLogsController < ApplicationController
end
redirect_to(send(redirect_path, @case_log))
rescue ActiveRecord::RecordInvalid
page_info = form.all_pages[previous_page]
render "form/page", locals: { form: form, page_key: previous_page, page_info: page_info }
end
end
def check_answers
@ -51,13 +56,13 @@ class CaseLogsController < ApplicationController
form.all_pages.map do |page_key, page_info|
define_method(page_key) do
@case_log = CaseLog.find(params[:case_log_id])
render "form/page", locals: { case_log_id: @case_log.id, form: form, page_key: page_key, page_info: page_info }
render "form/page", locals: { form: form, page_key: page_key, page_info: page_info }
end
end
private
def page_params(questions_for_page)
params.permit(questions_for_page)
params.require(:case_log).permit(questions_for_page)
end
end

6
app/helpers/conditional_questions_helper.rb

@ -6,10 +6,6 @@ module ConditionalQuestionsHelper
end
def display_question_key_div(page_info, question_key)
if conditional_questions_for_page(page_info).include?(question_key)
"<div id=#{question_key}_div style='display:none;'>".html_safe
else
"<div id=#{question_key}_div>".html_safe
end
"style='display:none;'" if conditional_questions_for_page(page_info).include?(question_key)
end
end

2
app/models/case_log.rb

@ -1,3 +1,5 @@
class CaseLog < ApplicationRecord
enum status: { "in progress" => 0, "submitted" => 1 }
validates :tenant_age, presence: true
end

11
app/views/form/page.html.erb

@ -1,26 +1,23 @@
<% previous_page = form.previous_page(page_key) %>
<% content_for :before_content do %>
<%= govuk_back_link href: "/case_logs/#{case_log_id}/#{previous_page}" do %>
<%= govuk_back_link href: "/case_logs/#{@case_log.id}/#{previous_page}" do %>
Back
<% end %>
<% end %>
<%= turbo_frame_tag "case_log_form", target: "_top" do %>
<% if page_info["header"].present? %>
<h1 class="govuk-heading-xl">
<%= page_info["header"] %>
</h1>
<% end %>
<%= form_with action: '/case_logs', method: "next_page", builder: GOVUKDesignSystemFormBuilder::FormBuilder do |f| %>
<%= form_with model: @case_log, method: "next_page", builder: GOVUKDesignSystemFormBuilder::FormBuilder do |f| %>
<%= f.govuk_error_summary %>
<% page_info["questions"].map do |question_key, question| %>
<%= display_question_key_div(page_info, question_key)%>
<div id=<%= question_key + "_div" %><%= display_question_key_div(page_info, question_key) %> >
<%= render partial: "form/#{question["type"]}_question", locals: { question_key: question_key, question: question, f: f } %>
</div>
<% end %>
<%= f.hidden_field :previous_page, value: page_key %>
<%= f.hidden_field :case_log_id, value: case_log_id %>
<%= f.govuk_submit "Save and continue" %>
<% end %>
<% end %>

3
config/routes.rb

@ -3,11 +3,12 @@ Rails.application.routes.draw do
get "about", to: "about#index"
get "/", to: "test#index"
post '/case_logs/:id', to: "case_logs#next_page"
form = Form.new(2021, 2022)
resources :case_logs do
form.all_pages.keys.map do |page|
get page.to_s, to: "case_logs##{page}"
post page.to_s, to: "case_logs#next_page"
form.all_subsections.keys.map do |subsection|
get "#{subsection}/check_answers", to: "case_logs#check_answers"
end

Loading…
Cancel
Save