ruby-on-rails - 如何在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 中创建新记录。所以现在只有一个问题,如何为我的表单制作多步,最终结果将被发送到创建动作?
解决方案
我认为您可以将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
希望它会帮助你。
推荐阅读
- python - 使用 POST VXML 引发 MultiValueDictKeyError(key)
- firebase - Firebase 实时 .indexOn
- android - 预编译 Android 布局以加快视图创建速度
- sql - 查询未按预期工作,可能的语法错误?
- sql - 我们如何在每日报告的同一行中获得今天的价值和最近 7 天的价值?
- node.js - 如何删除文件池上的临时上传文件
- java - 双向映射错误:无法确定类型
- timezone - 有没有严格基于时间流逝的时间格式,而不是昼夜循环?
- java - 如何访问数组的枚举
- python - 使用 TimedJSONWebSignatureSerializer 重置令牌