【问题标题】:Rails call controller action on successful object saveRails 在对象保存成功时调用控制器操作
【发布时间】:2014-04-26 02:06:04
【问题描述】:

我有一个由 devise 生成的用户注册表单。提交表单并将用户对象保存到数据库时,我想创建并保存另一个对象,在单独的控制器(leads_controller.rb)中生成并传递刚刚保存的用户对象。注册表单正在收集电子邮件、密码和密码确认。

保存用户后,我需要将该用户对象传递给leads_controller 以调用新的和创建的操作。

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 

我可以在我的 registrations_controller.rb 中添加一个操作来将用户对象传递给leads_controller.rb吗?

【问题讨论】:

  • 您是使用贷方还是用户注册控制器进行注册
  • @ShamsulHaque 我正在使用贷方注册控制器(如上所示)覆盖默认用户注册控制器。我这样做是为了以某种方式调用主控制器并将用户传递给它。我只是不知道该怎么做。
  • 您是否检查过它是否会发送给贷方注册控制器
  • @ShamsulHaque 是的,我已经通过在创建对象时将贷方registrations_controller 放到我的终端上来测试它。

标签: ruby-on-rails ruby-on-rails-4 devise salesforce


【解决方案1】:

复制内容
https://github.com/plataformatec/devise/blob/master/app/controllers/devise/registrations_controller.rb

并粘贴到 registrations_controller.rb

更改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

registration_controller.rb 中将 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

registration_controller.rb

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

设计提供一个辅助方法 current_user,您可以通过它了解 leads_controller.rbviews 中的 user 对象强>

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

【讨论】:

  • 使用 current_user 是个好主意。但是我还是不知道registrations_controller#create完成后如何执行leads_controller#new?
  • 这很棒。它现在将我发送到成功注册的潜在客户/新用户。同时,我需要弄清楚如何将其重定向到不同的控制器,但一旦我将 current_user 信息发布到我的 salesforce 数据库,我就会将此答案标记为正确。谢谢!
  • 我遇到了一些问题,因为它们都链接在一起了。用户注册后,会被定向到 /leads/new,在那里他们会作为潜在客户推送给 salesforce。但是,当它们被推送到 /leads/new 时,当我将电子邮件设置为 current_user.email 时,我收到“nil:NilClass 的未定义方法‘电子邮件’”?我不确定是否正在进行会话以从当前用户中提取电子邮件?
  • 由于某种原因,我无法在 current_user 注册后立即访问他们的会话数据。如果我通过登录页面登录并导航到潜在客户/新并提交表单,则接受我的 current_user.email 数据没有问题
猜你喜欢
  • 1970-01-01
  • 2013-06-25
  • 2016-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-04
  • 1970-01-01
  • 2015-10-12
相关资源
最近更新 更多