Как сделать многошаговую форму в Rails и предложить пользователю зарегистрироваться после заполнения формы? - PullRequest
1 голос
/ 18 июня 2019

У меня в приложении есть модель под названием «Запрос». Он состоит из 12 полей. Он имеет отношение к пользовательской модели, такой как Пользователь has_many: запрос, Запрос относится к пользователю: Пользователь. Для пользователей я использую Devise. Моя проблема следующая. Я хочу, чтобы у пользователя с домашней страницы моего приложения была возможность начать создавать новый запрос. Это должна быть многоступенчатая форма, такая как 3 шага с 4 входами на каждом шаге. После выполнения всех шагов мне нужно предложить пользователю зарегистрироваться. Я не хочу, чтобы новая строка в таблице запросов создавалась до тех пор, пока пользователь не выполнит регистрацию. Таким образом, процесс должен выглядеть так, как будто пользователь выполняет каждый шаг, мы каким-то образом сохраняем все входные данные, после регистрации пользователя мы создаем нового пользователя в таблице Users и новый запрос в таблице Requests. Я не хочу хранить запрос до тех пор, пока пользователь не будет зарегистрирован, потому что в этом случае в моей базе данных будет много запросов, которые не принадлежат ни одному пользователю. Так как же мне достичь своей цели? ОБНОВИТЬ: Так что с пользователями предлагает и с поиском я получаю некоторый прогресс. Итак, теперь у меня есть форма на одной странице (все 12 полей), после нажатия на кнопку «Отправить» она переходит к действию «создать» в RequestController, где я делаю такой код:

if current_user.nil?
  session[:request] = params
 # Redirect the user to register/login
  redirect_to new_user_registration_path 

Итак, я получаю все параметры, сохраняю их в сеансе [: запрос] и перенаправляю на страницу регистрации. Чем в ApplicationController я добавил код:

if session[:request].present?

        # save list
        @request = current_user.requests.create(session[:request]["request"])

        # clear session
        session[:request] = nil

, которые связывают параметры запроса с current_user и создают новую запись в БД. Так что теперь только одна проблема, как сделать многошаговую для моей формы, которая в конечном итоге будет отправлена ​​для создания действия?

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Думаю, вы можете использовать злой камень для пошагового мастера.

И на первом шаге html-шаблон сохраняет только те поля ввода, которые вам необходимы, а на втором шаге сохраните значения первого шага в скрытом поле, аналогично на третьем шаге вы можете сохранить значения первого и второго шага в скрытом поле.

и в контроллере Просто присвойте значения переменной @request

steps :step_one, :step_two, :step_three

def request_steps
 @request = Request.new
 @request.assign_attributes(params[:request])
 case step
 when :step_one
   #add code here you want to do in step one
 when :step_two
   #add code here you want to do in step two
 when :step_three
   #add code here you want to do in step three
 end
 render_wizard
end

Альтернативное решение: Если вы не хотите хранить в скрытом поле и не использовать wicked и выполнять многошаговые действия, тогда другое решение - сохранить входные данные запроса в сеансе, как показано ниже:

def step1
  session[:user_request] ||= {}
  session[:user_request].merge!{params[request]} #merge input from step1
  # render to show step2 
end

def step2
  session[:user_request] ||= {}
  session[:user_request].merge!{params[request]} #merge input from step2
  # render to show step3 
end

def step3
  session[:user_request] ||= {}
  session[:user_request].merge!{params[request]} #merge input from step3
  # render to login/signup_page 
end

и после входа в систему вы можете найти данные запроса с помощью сеанса [: user_request] и сохранить запрос с зарегистрированным пользователем и очистить сеанс [: user_request], как в вашем контроллере сеанса devise

after_filter :after_login, :only => :create

def after_login
  if session[:user_request]
    request = current_user.requests.build(session[:user_request])
    session[:user_request] = nil if request.save
  end
end

Надеюсь, это поможет вам.

0 голосов
/ 18 июня 2019

Было бы предложено сохранить значения во Front-end и на последнем шаге отправить всю информацию.Это может быть достигнуто с помощью javascrit, и все переменные будут естественным образом храниться в переменных.Я думаю, что это один из самых простых способов.

Другая идея заключается в создании нескольких методов в контроллере (и маршрутах), которые собирают всю информацию, на что это может быть похоже (с использованием предпочтительного ajax или обычных почтовых запросов).):

def step1
    params = params[:params]
    #...
end

def step2
    params = params[:params]
    #...
end

И затем вы можете создать столбец, который временно хранит всю информацию (только в столбце, в формате json или hash) и просто отправляет вправостолбцы после того, как пользователь подтвердил всю информацию.Затем вы можете создать задание cron для удаления записей из временных столбцов.

Это всего лишь несколько предложений.Я с нетерпением жду новых идей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...