3

我有一个两步表单,它在会话中保存数据并假设用户已登录创建一个新记录。

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

  1. 填写表格#1
  2. 填写表格#2
  3. 重定向到设计注册 ( new_registration_path)
  4. 注册/登录完成后从表单数据发布/创建记录

请参见下面的代码(location_controller.rb):

On:“ elsif @location.last_step?”,如果用户未登录,则直接注册,但登录后不保存数据。

有没有办法通过设计思想传递会话表单数据,以便在注册后发布/创建记录?

提前致谢

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
4

1 回答 1

1

我解决了它:

  1. store_form_data(@location)在locations.rb中添加
  2. SessionHelper 中的 store_form_data 函数(见下文)
  3. 添加include SessionsHelper到 application_controller.rb
  4. 在 application_controller.rb 中添加了def after_sign_in_path_for(resource)函数(见打击)

应用程序/helpers/session_helper.rb:

module SessionsHelper
  def store_form_data(locations)
    session[:form_data] = locations
  end
end

应用程序/控制器/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

应用程序/控制器/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
于 2013-03-15T16:46:26.093 回答