首页 > 解决方案 > 如何在Rails中制作多步表单并在填写表单后提示用户注册?

问题描述

我的 Rails 应用程序中有一个名为“请求”的模型。它由大约 12 个字段组成。它与用户模型有关系,如 User has_many: request、Request belongs_to: User。对于用户,我使用设计。我的问题是下一个。我希望我的应用程序主页上的用户有可能开始创建新请求。它应该是多步形式,例如 3 步,每步有 4 个输入。填写完所有步骤后,我需要提示用户注册。在用户注册之前,我不希望在请求表中创建新行。所以这个过程应该看起来像用户抛出每一步,我们以某种方式存储所有输入数据,在用户注册后,我们在用户表中创建新用户并在请求表中创建新请求。我不 在用户注册之前不想存储请求,因为在这种情况下,我的数据库中会有很多不属于任何用户的请求。那么我怎样才能实现我的目标呢?更新:因此,随着用户的建议和搜索,我取得了一些进展。所以现在我在一页上有表单(所有 12 个字段),点击提交后它转到 RequestController 中的“创建”操作,我在其中执行这样的代码:

if current_user.nil?
  session[:request] = params
 # Redirect the user to register/login
  redirect_to new_user_registration_path 

所以我得到所有参数,将它们存储在 session[:request] 中并重定向到注册页面。比在 ApplicationController 中我添加了代码:

if session[:request].present?

        # save list
        @request = current_user.requests.create(session[:request]["request"])

        # clear session
        session[:request] = nil

它将请求参数与 current_user 连接并在 db 中创建新记录。所以现在只有一个问题,如何为我的表单制作多步,最终结果将被发送到创建动作?

标签: ruby-on-rails

解决方案


我认为您可以将wicked gem用于分步向导。

并且在第一步 html 模板中只保留您需要的输入字段,并在第二步中将第一步值存储在隐藏字段中,类似地在第三步中您可以将第一步和第二步值存储在隐藏字段中。

并且在控制器中只需分配 @request 变量中的值

steps :step_one, :step_two, :step_three

def request_steps
 @request = Request.new
 @request.assign_attributes(params[:request])
 case step
 when :step_one
   #add code here you want to do in step one
 when :step_two
   #add code here you want to do in step two
 when :step_three
   #add code here you want to do in step three
 end
 render_wizard
end

替代解决方案:如果您不想存储在隐藏字段中并且不使用 wicked 并且有多个步骤操作,那么另一种解决方案是将请求输入存储在会话中,如下所示:

def step1
  session[:user_request] ||= {}
  session[:user_request].merge!{params[request]} #merge input from step1
  # render to show step2 
end

def step2
  session[:user_request] ||= {}
  session[:user_request].merge!{params[request]} #merge input from step2
  # render to show step3 
end

def step3
  session[:user_request] ||= {}
  session[:user_request].merge!{params[request]} #merge input from step3
  # render to login/signup_page 
end

用户登录后,您可以使用 session[:user_request] 找到请求数据,并使用登录用户保存请求并清除 session[:user_request],就像在您的设计会话控制器中一样

after_filter :after_login, :only => :create

def after_login
  if session[:user_request]
    request = current_user.requests.build(session[:user_request])
    session[:user_request] = nil if request.save
  end
end

希望它会帮助你。


推荐阅读