我正在尝试找到一种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
答案 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
即可。