我有一个两步形式,可以在会话中保存数据并在假设用户已登录的情况下创建新记录。
如果新用户尚未注册,我希望他能够:
填写表格#1
填写表格2
重定向到Devise注册(new_registration_path
)
注册/登录完成后从表单数据中发布/创建记录
请参见下面的代码(location_controller.rb):
开:“ elsif @location.last_step
?”,如果用户未登录但登录后未保存数据,它将定向到注册。
是否可以通过Devise传递会话表单数据,以便在注册后发布/创建记录?
提前致谢
def new
session[:location_params] ||= {}
if current_user.nil?
@location = Location.new(session[:location_params])
else
@location = current_user.locations.new(session[:location_params])
end
@location.current_step = session[:location_step]
respond_to do |format|
format.html # new.html.erb
format.json { render json: @location }
end
end
def create
session[:location_params].deep_merge!(params[:location]) if params[:location]
if current_user.nil?
@location = Location.new(session[:location_params])
else
@location = current_user.locations.new(session[:location_params])
end
@location.current_step = session[:location_step]
if @location.valid?
if params[:back_button]
@location.previous_step
elsif @location.last_step?
@location.save
else
@location.next_step
end
session[:location_step] = @location.current_step
end
if @location.new_record?
render "new"
else
session[:location_step] = session[:location_params] = nil
flash[:notice] = "Trip saved!"
redirect_to @location
end
end
最佳答案
我解决了:
在locations.rb中添加了store_form_data(@location)
SessionHelper中的store_form_data函数(请参见下文)
已将include SessionsHelper
添加到application_controller.rb
在application_controller.rb中添加了def after_sign_in_path_for(resource)
函数(请参见打击)
app / helpers / session_helper.rb:
module SessionsHelper
def store_form_data(locations)
session[:form_data] = locations
end
end
app / controllers / application_controller.rb:
class ApplicationController < ActionController::Base
protect_from_forgery
include SessionsHelper
def after_sign_in_path_for(resource)
if session[:form_data].present?
@user = current_user
@location = session[:form_data]
@user.locations << @location
session[:form_data] = nil
flash[:notice] = 'Trip saved!'
index_path
else
new_location_path
end
end
end
apps / controllers / locations_controller.rb:
def new
#@location = Location.new
session[:location_params] ||= {}
session[:form_data] = nil
if current_user.nil?
@location = Location.new(session[:location_params])
else
@location = current_user.locations.new(session[:location_params])
end
@location.current_step = session[:location_step]
respond_to do |format|
format.html # new.html.erb
format.json { render json: @location }
end
end
def create
session[:location_params].deep_merge!(params[:location]) if params[:location]
if current_user.nil?
@location = Location.new(session[:location_params])
else
@location = current_user.locations.new(session[:location_params])
end
@location.current_step = session[:location_step]
if @location.valid?
if params[:back_button]
@location.previous_step
elsif @location.last_step?
if current_user.nil?
store_form_data(@location)
end
@location.save
else
@location.next_step
end
session[:location_step] = @location.current_step
end
if @location.new_record?
render "new"
else
session[:location_step] = session[:location_params] = nil
flash[:notice] = "Trip saved!"
redirect_to @location
end
end