0

Railsプラットフォームは初めてです...フォームで[登録]をクリックすると、ユーザーのサインアップ情報を保存するという問題があります....エラーは発生しませんが、Railsコンソールを確認すると、すべてのユーザー情報がnilと見なされます...理由がわかりません。私のユーザーステップコントローラーコード

class UserStepsController < ApplicationController
include Wicked::Wizard
 steps :finishing_step

def show
 @user = current_user
  render_wizard
end

def update
  @user = current_user
  if @user.save
   redirect_to root_path
  else
    render_wizard
  end
end

def user_params
  params.require(:user).permit(:first_name, :middle_name, :last_name, :address_first_line, :address_second_line, :city, :nationality)
end

private

def redirect_to_finish_wizard
  redirect_to root_path, notice: "Thanks for signing up."
end
end

以下はユーザーコントローラーのコードです

class UsersController < ApplicationController
def create
@user = User.new(params[:user])
      if @user.save
        redirect_to root_path
      else
        render_wizard
      end
    end
  end

以下は、ユーザーのサインアップ情報を含む私の単純なフォームのコードです

<%= form_for User.new, url: wizard_path do |f| %>
<div><%= f.label :first_name, "First Name" %><br />
    <%= f.text_field :first_name %></div>
  <div><%= f.label :middle_name, "Middle Name" %><br />
    <%= f.text_field :middle_name %></div>
  <div><%= f.label :last_name, "Last Name" %><br />
    <%= f.text_field :last_name %></div>
  <div><%= f.label :phone_number, "Phone Number" %><br />
    <%= f.text_field :phone_number %></div>
  <div><%= f.label :date_of_birth, "Date of Birth" %><br />
    <%= f.date_select :date_of_birth, start_year: 1900 %></div>
  <div><%= f.label :address_first_line, "Address (first line)" %><br />
    <%= f.text_field :address_first_line %></div>
  <div><%= f.label :address_second_line, "Address (second line)" %><br />
    <%= f.text_field :address_second_line %></div>
  <div><%= f.label :city, "City" %><br />
    <%= f.text_field :city %></div>
  <div><%= f.label :nationality, "Nationality" %><br />
    <%= country_select(:user, :nationality, {selected: "UG"}) %></div>
    <div>
    <%= f.label :avatar %>
    <%= f.file_field :avatar %>
  </div>
  <div>
    <%= f.label :terms_of_service, "Agree to Terms of Service" %> <br>
    <%= f.check_box :terms_of_service %>
  </div>
  <%= f.submit "Register", class: "btn btn-primary" %>
  <% end %>

事前に感謝します

4

1 に答える 1

0

あなたの考えにはいくつかの間違いがあると思います。ウィザードは、ユーザーのサインアップ後に動作します。したがって、基本的には、ウィザードを使用せずに最初にユーザーを作成する必要があります。

  1. ユーザーの作成

モデルでDeviseを使用している場合User、ユーザーコントローラーはすでにどこかにあります。実際、Devise を使用している場合、クラス UsersController は役に立ちません。

そのため、サインアップ後にウィザードの手順にリダイレクトする場合は、Devise 登録コントローラーをオーバーライドする必要があります (ドキュメント: Redirect to specific page )。これを行うには、次のような新しいコントローラーを作成します。

class RegistrationsController < Devise::RegistrationsController
  protected

  def after_sign_up_path_for(resource)
    user_steps_path(:finishing_step) #add proper route
  end
end

config/route.rb ファイルの内容はありませんが、次のようなものが必要です:

resources :user_steps
  1. ステップの追加

邪悪なウィザードは次のように機能します: - 2 つのアクション (表示と更新) を持つ 1 つのコントローラー - N ステップの N ビュー (1 ステップ = 1 ビュー、42 ステップ = 42 ビュー)

アクション show で現在のステップの名前にアクセスし、 を使用して更新できますstep

render_wizard現在のステップのビューを render_wizard @userレンダリングする 次のステップのビューをレンダリングする (エラーがある場合は現在のステップのビューをレンダリングする)

  1. 強力なパラメーターの使用

コントローラーでは、決して使用しませんuser_params。したがって、更新アクションでは、フォームのパラメーターを @user に指定することはありません。current_userあなたのために user_params を呼び出しません。

また、との間には大きな違いがsaveありupdate_attributes、更新アクションで2番目を使用したいと思います。

user_params も private セクションに配置することをお勧めします。

  1. コントローラーの最終形

コントローラーは次のようになります。

  class UserStepsController < ApplicationController
    include Wicked::Wizard

    steps :finishing_step

    def show
      @user = current_user
      render_wizard
    end

    def update
      @user = current_user
      if @user.update_attributes(user_params)
        # because you only have one step, you don't need render_wizard @user
        redirect_to_finish_wizard
      else
        render_wizard
      end
    end

    private

    def user_params
      params.require(:user).permit(:first_name, :middle_name, :last_name, :address_first_line, :address_second_line, :city, :nationality)
    end

    def redirect_to_finish_wizard
      redirect_to root_path, notice: "Thanks for signing up."
    end
  end
  1. ドキュメントを読む

邪悪なドキュメントのいくつかのヒントを見逃していると思います。読み直したほうがいいかもしれません。 邪悪なドク

于 2015-04-01T09:54:57.893 に答える