3

セッションにデータを保存し、ユーザーがログインしていると仮定して新しいレコードを作成する2つのステップのフォームがあります。

新しいユーザーがサインアップしていない場合は、次のことができるようにしたいと思います。

  1. フォーム#1に記入
  2. フォーム#2に記入
  3. Deviseサインアップにリダイレクト(new_registration_path
  4. サインアップ/ログインが完了した後、フォームデータからレコードを投稿/作成します

以下のコードを参照してください(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
4

1 に答える 1

1

私はそれを解決しました:

  1. store_form_data(@location)location.rb に追加
  2. SessionHelper の store_form_data 関数 (以下を参照)
  3. include SessionsHelperapplication_controller.rb に追加
  4. application_controller.rb に関数を追加def after_sign_in_path_for(resource)(下記参照)

アプリ/ヘルパー/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 に答える