Не могу сохранить информацию о регистрации пользователя при использовании devise и wicked

Я новичок в платформе rails... У меня проблема с сохранением информации о регистрации пользователя при нажатии регистрации в моей форме.... Я не получаю ошибки, но при проверке консоли rails вся информация о пользователе приравнивается к нулю... не могу понять, почему. мой код контроллера шагов пользователя

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 %>

за любую помощь, спасибо заранее

1 ответ

Решение

Я думаю, что в вашей концепции есть некоторые ошибки. Мастер работает ПОСЛЕ регистрации вашего пользователя. Таким образом, в основном вам нужно сначала создать своего пользователя без мастера.

  1. Создание вашего пользователя

Если вы используете Devise с вашей моделью User, у вас уже есть пользовательский контроллер где-то. На самом деле, ваш класс UsersController бесполезен, если вы используете Devise.

Поэтому, если вы хотите перенаправить на шаг мастера после регистрации, вам необходимо переопределить контроллер регистрации Devise (doc: Перенаправление на определенную страницу). Для этого создайте новый контроллер следующим образом:

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. Добавление шагов

Wicked Wizard работает следующим образом: - Один контроллер с 2 действиями (показать и обновить) - N просмотров за N шагов (1 шаг = 1 просмотр, 42 шага = 42 просмотра)

Вы можете получить доступ к названию вашего текущего шага в действиях показать и обновить, используя step,

render_wizard сделать вид текущего шагаrender_wizard @user визуализировать следующий шаг (или текущий шаг, если есть какая-либо ошибка)

  1. Использование сильных параметров

В вашем контроллере вы никогда не используете user_params, Таким образом, в вашем действии обновления вы никогда не используете @user с параметрами из вашей формы. current_user не вызывает user_params для вас.

Кроме того, существует большая разница между save а также update_attributes и я думаю, что вы хотите использовать второе в вашем действии обновления.

Лучше размещать user_params также в приватном разделе.

  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. Читать документ

Я думаю, что вы пропустили несколько советов в злой док. Может быть, вы должны перечитать это. Злой док

Другие вопросы по тегам