Class: ContactFormsController

Inherits:
BasePortalController show all
Defined in:
app/controllers/contact_forms_controller.rb

Overview

Controller: contact forms.

Constant Summary

Constants included from Controllers::MasqueradeGuarded

Controllers::MasqueradeGuarded::DEFAULT_BLOCK_MESSAGE

Constants included from Controllers::AnalyticsEvents

Controllers::AnalyticsEvents::MAX_QUEUED_EVENTS, Controllers::AnalyticsEvents::SESSION_KEY

Constants included from Controllers::ErrorRendering

Controllers::ErrorRendering::NON_CONTENT_PATH_PREFIXES

Instance Method Summary collapse

Methods inherited from BasePortalController

#current_ability, #portal_party, #set_catalog, #set_webpack

Methods included from Controllers::MasqueradeGuarded

block_while_masquerading, #masquerade_blocks?

Methods inherited from ApplicationController

#account_impersonated?, #add_to_flash, #after_sign_in_path_for, #bypass_forgery_protection?, #chat_enabled?, #cloudflare_cleared?, #default_catalog, #default_url_options, #enable_turbo_frames, #find_publication, #fix_invalid_accept_header, #init_js_utils, #is_globals_call?, #layout_by_resource, #locale_store, #redirect_to, #require_employee_for_crm, #set_base_host, #set_real_ip, #set_report_errors_for, #should_render_layout?, #skip_layout_for_turbo_frame?, #stamp_impersonation_context, #tab_frame_breakout_request?, #warmlyyours_canada_ip?, #warmlyyours_ip?, #y

Methods included from Controllers::ReturnPathHandling

#check_for_return_path, #redirect_to_return_path_or_default

Methods included from Controllers::AnalyticsEvents

#consume_queued_analytics_events, #registration_lead_type, #track_event

Methods included from Controllers::DeviceDetection

#device_detector, #is_ie?

Methods included from Controllers::SubdomainDetection

#is_crm_request?, #is_www_request?, #json_request?

Methods included from Controllers::TurboSafeRedirect

#redirect_to

Methods included from Controllers::TrackingDetection

#bot_request?, #gdpr_country?, #gdpr_country_data, #prevent_bots, #set_tracking_cookie, #track_visitor?

Methods included from Controllers::AcceleratedFileSending

#send_file_accelerated, #send_upload_accelerated

Methods included from Controllers::ErrorRendering

#excp_string, #mail_to_for_error_reporting, #render_400, #render_404, #render_406, #render_410, #render_500, #render_invalid_authenticity_token, #render_ip_spoof_error, #render_unpermitted_parameters, #safe_referer_or_fallback

Methods included from Controllers::TurnstileVerification

#load_turnstile_script_tag, #turnstile_lazy_widget, #turnstile_script_tag, #turnstile_widget, #validate_turnstile!

Methods included from Controllers::CloudflareCaching

edge_cached, #edge_cached_action?, #reset_cloudflare_cache, #set_cloudflare_cache, #skip_edge_cache!, #skip_session

Methods included from Controllers::Webpackable

#preload_webpack_fonts, #webpack_css_include, #webpack_css_url, #webpack_js_include, #wpd_is_running?

Methods included from Controllers::Localizable

#cloudflare_country_locale, #determine_request_locale, #geocoder_locale, #guest_user_locale_check, #locale_optional_www_auth_path?, #param_locale, #set_locale, #set_request_locale, #skip_localization?, #warmlyyours_ip_locale

Methods included from Controllers::Authenticable

#access_denied, #authenticate_account, #authenticate_account!, #authenticate_account_from_login_token!, #check_is_a_manager, #check_is_a_sales_manager, #check_is_an_admin, #check_is_an_employee, #check_party, #clear_mismatched_guest_user, #create_guest_user, #credentials?, #current_or_guest_user, #current_or_guest_user_id_read_only, #current_user, #devise_mapping, #fully_logged_in?, #generate_bot_id, #guest_user, #identifiable?, #init_current_user, #initialize_guest, #load_context_user, #logging_in, #resource, #resource_name, #restrict_access_for_non_employees, #scrubbed_request_path, #user_object, #warn_on_session_guest_id_leak

Methods included from UrlsHelper

#catalog_breadcrumb_links, #catalog_link, #catalog_link_for_product_line, #catalog_link_for_sku, #cms_link, #delocalized_path, #path_to_sales_product_sku, #path_to_sales_product_sku_for_product_line, #path_to_sales_product_sku_for_product_line_slug, #product_line_from_catalog_link, #protocol_neutral_url, #sanitize_external_url, #valid_external_url?

Instance Method Details

#createvoid

This method returns an undefined value.

POST /contact/:form_type — validates and submits the contact form,
after spam/bot checks.



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'app/controllers/contact_forms_controller.rb', line 31

def create
  initialize_form_class

  # Turnstile validates bot protection via before_action
  # SpamCheck validates contact points against known fraudulent customers
  is_fraud = SpamCheck.new.process(
    author_email: params.dig(:contact_form, :homeowner_email_address),
    phone_number: params.dig(:contact_form, :homeowner_phone),
    request: request
  )

  if is_fraud
    respond_to do |format|
      flash[:error] = 'There was an error submitting your request. Please call us at (800) 875-5285.'
      format.html { redirect_back_or_to root_path }
      format.turbo_stream { redirect_back_or_to root_path }
    end
    return
  end

  if @form_class.nil?
    respond_to do |format|
      format.html { redirect_to_return_path_or_default cms_link('contact') }
      format.turbo_stream { redirect_to cms_link('contact') }
    end
  else
    @form_object = @form_class.new(params[:contact_form])
    @form_object.request = request

    respond_to do |format|
      if @form_object.save
        # Clear any saved form data on successful submission
        session.delete(:turnstile_failed_form_data)

        format.html { redirect_to_return_path_or_default cms_link("/contact/#{params[:form_type]}/thank-you") }
        format.turbo_stream { render "#{@form_action}_thank_you" }
      elsif template_exists?(@form_action)
        # Some forms (e.g. custom_product_training) live only as partials
        # embedded in other pages and have no standalone template to
        # re-render. For those we fall back to redirecting the user back
        # to the referring page with a flash error so the page can be
        # re-rendered with the restored form data.
        flash.now[:error] = 'There was a problem sending your request. Please try again.'
        # Re-render the form template (with the user's input preserved in
        # @form_object) instead of redirecting away. Turbo needs 422 to
        # swap the body inline.
        format.html { render @form_action, layout: 'www/cms_page', status: :unprocessable_content }
        format.turbo_stream { render 'contact_form_error', status: :unprocessable_content }
      else
        flash[:error] = 'There was a problem sending your request. Please try again.'
        format.html { redirect_back_or_to root_path }
        format.turbo_stream { redirect_back_or_to root_path }
      end
    end
  end
end

#newvoid

This method returns an undefined value.

GET /contact/:form_type — renders the requested contact form, restoring
in-progress data if the visitor returned after a Turnstile failure.



12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'app/controllers/contact_forms_controller.rb', line 12

def new
  initialize_form_class
  if @form_class.nil? || !template_exists?(@form_action)
    ErrorReporting.warning('Contact form not found', form_type: params[:form_type], form_class: @form_class)
    redirect_to cms_link('contact')
  else
    @form_object = @form_class.new

    # Restore form data if user is returning after Turnstile failure
    restore_form_data_if_needed

    render action: @form_action, layout: 'www/cms_page'
  end
end

#thank_youvoid

This method returns an undefined value.

GET /contact/:form_type/thank-you — post-submission confirmation page.



91
92
93
94
95
96
97
98
# File 'app/controllers/contact_forms_controller.rb', line 91

def thank_you
  initialize_form_class
  if @form_class.present?
    render action: determine_thank_you_view, layout: 'www/cms_page'
  else
    redirect_to cms_link('contact')
  end
end