简体   繁体   中英

Rails call controller action on successful object save

I have a user sign up form generated by devise. When the form is submitted and the user object is saved to the database I would like to create and save another object, generated in a separate controller (leads_controller.rb) and pass the user object that was just saved. The sign up form is collecting email, password and password confirmation.

Once the user is saved, I need to pass that user object to the leads_controller to call the new and create actions.

leads_controller.rb

class LeadsController < ApplicationController
    include Databasedotcom::Rails::Controller

    def new
      @lead = Lead.new
    end 

    def create
      lead = Lead.new(params[:lead])
      lead.Email = @user.email
    end
end

routes.rb

  # User route
  devise_for :users
  devise_for :lenders, skip: :sessions, :controllers => {:registrations => "lenders/registrations"}
  devise_for :businesses, skip: :sessions

  root :to => 'business_account#dashboard', :constraints => lambda { |request| request.env['warden'].user.class.name == 'Business' }, :as => "business_root"
  root :to => 'lender_account#dashboard', :constraints => lambda { |request| request.env['warden'].user.class.name == 'Lender' }, :as => "lender_root"

  # Leads route
  resources :leads

registrations_controller.rb

class Lenders::RegistrationsController < Devise::RegistrationsController
  before_filter :update_sanitized_params

  def new
    super
  end

  def create
    super
  end

  def update
    super
  end

  private

    def update_sanitized_params
       devise_parameter_sanitizer.for(:sign_up) {|u| u.permit(:email, :password, :password_confirmation, :type)}
    end
end 

Is there an action I can put in my registrations_controller.rb to pass the user object to leads_controller.rb?

Copy the content from

https://github.com/plataformatec/devise/blob/master/app/controllers/devise/registrations_controller.rb

and paste into registrations_controller.rb

Change routes.rb

# User route
devise_for :users, :controllers => { :registrations => "registrations" }
devise_for :businesses, skip: :sessions

root :to => 'business_account#dashboard', :constraints => lambda { |request| request.env['warden'].user.class.name == 'Business' }, :as => "business_root"
root :to => 'lender_account#dashboard', :constraints => lambda { |request| request.env['warden'].user.class.name == 'Lender' }, :as => "lender_root"

# Leads route
resources :leads

In registration_controller.rb change the create action as

NOTE :- see also the change in create action

def create
build_resource(sign_up_params)

resource_saved = resource.save
yield resource if block_given?
if resource_saved
  if resource.active_for_authentication?
    set_flash_message :notice, :signed_up if is_flashing_format?
    sign_up(resource_name, resource)
    respond_with resource, location: after_sign_up_path_for(resource)
  else
    set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_flashing_format?
    expire_data_after_sign_in!
    respond_with resource, location: after_inactive_sign_up_path_for(resource)
  end
else
  clean_up_passwords resource
  respond_with resource
end
end

In registration_controller.rb

def after_sign_up_path_for(resource)
  redirect_to new_lead_path
  #after_sign_in_path_for(resource)
end

Devise provide a helper method current_user by which you can know user object in leads_controller.rb and also in views

class LeadsController < ApplicationController
  include Databasedotcom::Rails::Controller

  def new
    @lead = Lead.new
  end 

  def create
    lead = Lead.new(params[:lead])
    lead.email = current_user.email
  end
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