2

サインアップ ウィザードを作成するために wicked で devise を使用していますが、プロファイルを作成する際に発生した問題について確信が持てません。ユーザーが電子メールとパスワードを提供すると、指定した配送業者または運送業者に基づいてプロファイルを作成するステップに転送されます。ただし、一般的にプロファイルを作成するためのコントローラーとフォームにコードを含める必要があるかどうかはわかりません。アプリケーション用のコードは次のとおりです。

ステップコントローラー:

class UserStepsController < ApplicationController
  include Wicked::Wizard
  steps :carrier_profile, :shipper_profile


 def create
   @user = User.last
   case step
   when :carrier_profile
     @profile = CarrierProfile.create!(:dot => params[:dot])
     if @profile.save
        render_wizard @user
     else
        flash[:alert] = "Record not saved"
     end
   when :shipper_profile
     @profile = ShipperProfile.create!(params[:shipper_profile)
     if @profile.save
        render_wizard @user
     else
        flash[:alert] = "Record not saved"
     end
   end
 end

終了 終了

  def show
    @user = User.last
    @carrier_profile = CarrierProfile.new
    @shipper_profile = ShipperProfile.new
    case step
    when :carrier_profile
      skip_step if @user.shipper?
    when :shipper_profile
      skip_step if @user.carrier?
    end
    render_wizard
  end
end

運送業者プロファイルのフォーム:

<% form_for @carrier_profile , url: wizard_path, method: :post do |f| %>
  <div>
    <%= f.label :dot, "Please enter your DOT Number:" %>
    <%= f.text_field :dot %>
  </div>

  <%= f.submit "Next Step", class: "btn btn-primary" %>
<% end %>

荷送人プロファイルのフォーム:

<% form_for @shipper_profile , url: wizard_path, method: :post do |f| %>
  <div>
    <%= f.label :company_name, "What is your company name?" %>
    <%= f.text_field :company_name %>
  </div>

  <%= f.submit "Next Step", class: "btn btn-primary" %>
<% end %>

ユーザーモデル:

class User < ActiveRecord::Base
  has_one :carrier_profile
  has_one :shipper_profile
end

両方のプロファイルの作成を処理する一般的な new および create メソッドを作成するにはどうすればよいでしょうか? 現在のコードでは、user_steps コントローラーに POST メソッドがないことを示していますが、rake ルートを実行すると、これは正しくないことがわかります。

4

1 に答える 1

3

ステップ :profile_select を追加して、作成するプロファイルを見つけます

class UserStepsController < ApplicationController
  include Wicked::Wizard
  steps :profile_select, :carrier_profile, :shipper_profile

  def update
    @user = current_user
    case step
    when :profile_select
      if params[:user][:profile_type] == 'carrier'
        @profile = current_user.carrier_profile.build 
      else
        @profile = current_user.shipper_profile.build 
      end
    when :carrier_profile
      current_user.carrier_profile.update_attributes(params[:carrier_profile])
      when :shipper_profile
      current_user.shipper_profile.update_attributes(params[:shipper_profile])
    end
    render_wizard @user
  end

  def show
    @user = current_user
    case step
    when :carrier_profile
      skip_step if @user.shipper?
    when :shipper_profile
      skip_step if @user.carrier?
    end
    render_wizard
  end
end

ビュー/user_steps/profile_select.html.erb:

注: method :put を使用すると、すべてのステップで update が呼び出されます

<%= form_for current_user, url: wizard_path, method: :put do |f| %>
  <%= f.label :profile_type %>
  <%= f.text_field :profile_type %>
  <%= f.submit "Next Step", class: "btn btn-primary" %>
<% end %>    

ビュー/user_steps/carrier_profile.html.erb:

<% form_for @profile, url: wizard_path, method: :put do |f| %>
  <div>
    <%= f.label :dot, "Please enter your DOT Number:" %>
    <%= f.text_field :dot %>
  </div>

  <%= f.submit "Next Step", class: "btn btn-primary" %>
<% end %>

ビュー/user_steps/shipper_profile.html.erb:

<% form_for @profile, url: wizard_path, method: :put do |f| %>
  <div>
    <%= f.label :company_name, "What is your company name?" %>
    <%= f.text_field :company_name %>
  </div>

  <%= f.submit "Next Step", class: "btn btn-primary" %>
<% end %>
于 2012-06-01T09:42:50.240 に答える