2013-09-04 4 views
1

У меня есть регистрация, которая состоит из 2 шагов. В первом, новый пользователь установит свое имя, адрес электронной почты и пароль. Затем он нажимает кнопку «Зарегистрироваться» и перенаправляется на страницу, где находится вторая часть регистрационной формы (около 5-7 полей).Rails - как проверить двухэтапную форму?

Я установил правила валидации на всех входах (7-10 полей). Проблема в том, что когда я заполняю первую часть формы, а затем нажимаю кнопку «Зарегистрироваться», я вижу ошибки проверки, потому что поля из второй части формы недействительны.

Как избежать такого поведения?

Спасибо

+0

Отъезд [это] (http://stackoverflow.com/questions/2603464/how-to-create-wizard-forms-in-ruby-on-rails? rq = 1) answer Возможно, вам не нужно делать это вручную. –

ответ

1

Вы можете определить виртуальный атрибут, который будет использоваться для определения того, какие атрибуты для проверки на каком этапе, а затем использовать значение этого атрибута на with_options проверить необходимые поля на каждом шаге.

Что-то вроде следующего:

В вашей модели:

class MyModal < ActiveRecord::Base 
    attr_accessor :validate_step 

    with_options if: :validate_step_one? do |o| 
    o.validates :name, presence: true 
    o.validates :email, presence: true 
    o.validates :password, presence: true 
    end 

    with_options if: :validate_step_two? do |o| 
    ... 
    end 

    private: 

    def validate_step_one? 
    self.validate_step == 'validate_first_step' 
    end 

    def validate_step_two? 
    self.validate_step == 'validate_second_step' 
    end 
end 

Затем в контроллере:

class MyRegistrationController < ApplicationController 
    def show 
    case step 
     when :first_step 
     user.validate_step = 'validate_first_step' 
     when :second_step 
     user.validate_step = 'validate_second_step' 
    end 
    end 
end 

В контроллере, в действии, где вы строите объект, который нужно назначьте либо validate_first_step, либо validate_second_step на основе текущего шага в вашем мастере.

Обратите внимание, что значения и имена, которые я использовал, не очень описательный/осмысленным, и вы бы знали гораздо лучше, как их назвать :)

Смежные вопросы