同时创建rails对象并提供单独的请求

时间:2014-05-04 22:12:11

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

我正在尝试找到一种RESTful方式来使我的注册确认过程顺利进行。我正在使用Rails 4和Devise 3.0。流程如下:

用户注册 - >确认电子邮件已发送 - >用户点击确认电子邮件链接 - >用户被引导到引导控制器,在那里它产生引导(对用户的空白页约2秒) - >然后用户被重定向到他们的仪表板。

当前流程不流动。当用户点击确认他们的电子邮件时,他们将被带到一个空白页面,我提交一个隐藏的表单来创建一个带有他们信息的潜在客户对象,一旦隐藏的表单被提交,仪表板页面就会被加载 - 这非常凌乱。几秒后URLS会发生变化,这会让用户感到困惑。

我想在点击确认电子邮件链接后创建一个潜在客户对象。我有当前流程通过leads_controller new路由用户并创建方法,然后它们会自动定向到他们的仪表板。我正在使用devise sign_in_count属性来确保这是他们第一次登录。如果这是他们第一次登录,我会引导他们通过潜在客户控制器生成带有他们信息的潜在客户。

我希望在用户选择电子邮件确认链接时加载仪表板页面时生成主要对象。

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
      new_lead_path
    else 
      stored_location_for(resource) || account_url
    end
  end
end 

leads_controller.rb

class LeadsController < ApplicationController
    before_filter :authenticate_user!
    include Databasedotcom::Rails::Controller

    def new
      @lead = Lead.new
    end

    def create
      @lead = Lead.new(params[:lead])
      @lead['RecordTypeId'] = 'XXXXX'
      @lead['OwnerId'] = 'XXXXX'
      @lead['FirstName'] = "XXXXXX"
      @lead['LastName'] = "XXXXX"
      @lead['Company'] = "XXXXX"
      @lead['Email'] = current_user.email
      @lead['IsConverted'] = false
      @lead['IsUnreadByOwner'] = true
      if @lead.save
        redirect_to lender_root_path
      end 
    end 
end

new.html.erb(这是提交以创建新的潜在客户对象的隐藏表单

<div class="container content">
    <%= form_for @lead do |f| %>
    <div class="field">
      <%= f.hidden_field :LeadSource, :value => 'Lending Loop' %>
      <%= f.hidden_field :Status, :value => 'Registered' %> 
    </div>
    <div class="actions">
      <%= f.submit :id => "hidden-submit", :style => "display: none;" %>
    </div>
    <% end %>
</div>
<script>
$(function () {
    $('#hidden-submit').click();
});
</script>

lender_account_controller.rb

class LenderAccountController < ApplicationController
    before_filter :authenticate_user!
    include Databasedotcom::Rails::Controller

    def dashboard
      render layout: 'simple'
      @leads = Lead.all
    end
end

1 个答案:

答案 0 :(得分:1)

除非我在这里遗漏了什么,为什么有必要提交隐藏的表格,如果它总是张贴相同的数据?设置LeadSource和Status可以在模型的before_create回调中完成。就此而言,您在create @lead['RecordTypeId'] = 'XXXXX'行动中的所有行为都属于模型中的回调。

我觉得流程应该是:

用户注册 - &gt;确认电子邮件已发送 - &gt;用户点击确认电子邮件链接 - &gt; user被引导到引导控制器@lead['IsUnreadByOwner'] = true动作,它处理后端的引线生成 - &gt; create操作会重定向到信息中心。他们从不访问create中的new操作,但您可能希望将其保留在那里以防将来需要它。您的创建操作可能很简单:

leads_controller.rb

然后将在模型上设置值的所有活动移动到def create @lead = Lead.new if @lead.save redirect_to lender_root_path end end 中的私有方法,让它在lead.rb回调中运行,或者在创建过程中的任何位置都适合您。< / p>

你也可以完全跳过Leads控制器,并在&#34;验证&#34;您的UsersController上的操作。用户单击该链接,验证帐户并执行相同的潜在客户创建操作。我想应该提到的是,在用户点击链接(GET请求)之后创建对象会被认为是对REST的不当使用,所以如果你想要在语义上正确,你可以将它们引导到他们所在的页面&# 39; d单击按钮以实际执行最终验证。它不会是无缝的,您需要权衡遵守标准VS您想要创建的用户体验。尽管如此,基础知识并没有改变:所有的对象创建都应该在后端完成,而不会将用户引导到空白页面。

由于我们正在谈论发生的混乱事情,因此控制器中会发生很多你应该避免的逻辑。特别是,ApplicationController中的before_create具有可能在将来导致问题的依赖性问题。从这开始:

<强> application_controller.rb

case

贷方模型

def account_url
  return new_user_session_url unless user_signed_in?
  current_user.root_path
end

商业模式

def root_path
  lender_root_path
end

root_path.rb模块

def root_path
  business_root_path
end

然后在所有需要响应root_path的其他模型中,只需module RootPath def root_path root_path end end ,该方法即可使用。之后,您只需致电include RootPath即可。

相关问题