简体   繁体   中英

Devise after confirmation form uninitialized constant error

This app is being built on Devise 3.0 and Rails 4.1 I have a User object with two subclasses (Lender and Business) through STI. After a Business registers and confirms their email address, they are redirected to a form to fill out more information about themselves (This data is stored in a new object called SuppForm). A business object has_one supp_form. I'm getting an error when the business confirms their email and is redirected to the form.

The error

ActionController::RoutingError (uninitialized constant SuppFormsController)

routes.rb (I used [ ] for business routes because I don't want them overlapping with the routes used in other places of the application)

# User type routes, needed to define specific sign out route to allow get request, not delete request
  devise_for :users, skip: :registrations do get '/users/sign_out' => 'devise/sessions#destroy' end
  devise_for :lenders, skip: :sessions, :controllers => {:registrations => "lenders/registrations"}
  devise_for :businesses, skip: :sessions, :controllers => {:registrations => "businesses/registrations"}

  resources :businesses, :only => [] do
    resource :supp_form
  end 

business.rb

class Business < User
  has_one :supp_form
  accepts_nested_attributes_for :supp_form
end

supp_form.rb

class SuppForm < ActiveRecord::Base
  belongs_to :business
end

supp_form_controller.rb

class SuppFormController < ApplicationController
    before_filter :authenticate_user!

    def new
      @suppform = SuppForm.new
    end 

    private

    def supp_form_params
      params.require(:supp_form).permit(:first_name, :last_name, :work_phone_number, :business_address, :business_postal_code)
    end
end

application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception

  def account_url
    return new_user_session_url unless user_signed_in?
    case current_user.class.name
    when "Business"
      business_root_path
    when "Lender"
      lender_root_path
    else
      root_path
    end if user_signed_in?
  end

  def after_sign_in_path_for(resource)
    if resource.sign_in_count == 1 && resource.type == "Business"
      new_business_supp_form_path(resource.id)
    else 
      stored_location_for(resource) || account_url 
    end 
  end

You can see in application_controller.rb I redirect the business to the supp_form based on the number of times they've logged in. I also try and pass through the business's ID by calling resource.id and passing that through the request. The URL when I get the error is: http://xxxxxxxxxx/businesses/14/supp_form/new

Looks like a pluralization problem. Change the controller to a plural name.

class SuppFormsController < ApplicationController
    before_filter :authenticate_user!
    # etc
end

Does sound weird though since there really is only a single supp_form generated from the controller. You could also try to setup inflections to prevent rails from attempting to pluralize the word supp_form in config/initializers/inflections.rb

ActiveSupport::Inflector.inflections do |inflect|
   inflect.uncountable %w( supp_form )
end

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM