我有一个两步形式,可以在会话中保存数据并在假设用户已登录的情况下创建新记录。

如果新用户尚未注册,我希望他能够:


填写表格#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

09-06 01:46