我在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中创建新记录。 因此,现在只有一个问题,如何对表单进行多步操作,最终将结果发送给我以创建操作?
答案 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作业,以从临时列中删除记录。
这些只是一些建议。我期待看到更多的想法。