如何在Rails中制作多步骤表单并在填写表单后提示用户进行注册?

时间:2019-06-18 09:15:01

标签: ruby-on-rails

我在Rails应用程序中有一个名为“ Request”的模型。它由12个字段组成。它与用户模型(例如,用户has_many:请求,请求属地:用户)有关系。对于用户,我使用Devise。我的问题是下一个。我希望该用户可以从我应用程序的主页开始创建新请求。它应该是多步形式,例如3步,每步4个输入。完成所有步骤后,我需要提示用户进行注册。我不希望在用户进行注册之前在请求表中创建新行。因此,该过程应该看起来像是用户抛出了每个步骤,我们以某种方式存储了所有输入数据,在用户注册后,我们在Users表中创建了新用户,在Requests表中创建了新请求。在用户注册之前,我不希望存储请求,因为在这种情况下,我的数据库中会有很多不属于任何用户的请求。那么我怎样才能实现自己的目标呢? 更新: 因此,随着用户的建议和搜索,我获得了一些进步。所以现在我在一页上有表单(所有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中创建新记录。 因此,现在只有一个问题,如何对表单进行多步操作,最终将结果发送给我以创建操作?

2 个答案:

答案 0 :(得分:1)

我认为您可以使用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

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

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]查找请求数据,并使用登录的用户保存请求并清除会话[:user_request],就像在devise会话控制器中一样

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

希望对您有帮助。

答案 1 :(得分:0)

建议将值存储在前端,并在最后一步发送所有信息。这可以使用javascrit来实现,所有变量自然都存储在变量中。我认为这是最简单的方法之一。

另一个想法是在控制器(和路由)中创建一些方法来收集所有信息,就像(使用更好的ajax或常规的post请求):

def step1
    params = params[:params]
    #...
end

def step2
    params = params[:params]
    #...
end

然后您可以创建一列临时stores所有信息(仅在列中,格式为json或哈希),并在用户确认所有信息后才发送到右列。然后,您可以创建一个cron作业,以从临时列中删除记录。

这些只是一些建议。我期待看到更多的想法。